Проекты на PascalABC.NET

Доброго времени суток, я так понимаю, здесь межконтинентальный бугурт на тему C# и Pascal. Так вот, мой проект vkapi pascalabc wrapper полностью совместим с .net Вот - VKAPI PascalABC.NET Wrapper

Нормальное описание тут.

Вот превьюшка что может SAC:

KeyD 160 //нажать левый шифт 
KeyP Ord("S") //нажать `S` на клавиатуре. Вместе с шифтом получиться заглавная версия буквы S 
KeyU 160 //отжать левый шифт 
Sleep 1000/3 //ждём 1/3 сек 

Jump "#" //прыгаем в начало этого файла (на пустую метку, которая всегда в начале файла)

(Это надо засунуть в файл какое то имя.sac и запустить, он будет 3 раза в сек. писать S, если вы откроете какой то текстовый редактор)

Остальное реально разобраться на примерах, README.md на гитхабе и справке (Help.exe)

Эх… еще бы знать, куда это приспособить…

Это более юзер-френдли версия, я старой (ужасно кривой) находил применяния, раз в несколько месяцев)) Для чего то простенького… А раз эта более юзабельная - знач и наверное жешь и применений больше)

Ну и написали бы, для чего можно. Я вот сколько не думал, так и не смог придумать.

А вот и применение :wink::

Вряд ли это может быть сильно интересно вам, но всё же, хоть где то полезно! :smiley:

Я наконец добрался до работы с сетью… И для начала решил сделать чат. Уже протестировал, работает по сети. Как запустить написано на гитхабе, но вот ещё перевод на русский:

  1. Файлы:

1.1. Компьютер-сервер должен иметь файл Server.exe

1.2. Компьютер-юзер (клиент) должен иметь файл Client.exe
(Если хотите и запустить сервер и подключится к нему - вам нужны оба .exe файла)

1.3. И серверу и клиенту нужен файл server adress.txt, содержащий ip и порт компьютера - сервера.
Его содержимое должно выглядит как что то типа 11.22.33.44:11000 (перед : стоит ip, а после - порт)
Все компьютеры которые должны соединится - должны иметь одинаковый ip и порт.

  1. Получение ip и порта:

Если вы не умеете настраивать переадресацию модема (portforward) - используйте что типа hamachi.
В таком случае скопируйте ip из hamachi (или из другой программы которую вы используете).
Иначе просто скопируйте ваш основной IPv4 адрес.
Далее выберите любой порт и отправьте готовый файл server adress.txt всем кто должен подключится.

  1. Запуск:

Сначала всегда запускайте сервер.
Затем запустите свой клиент и скажите всем остальным тоже запустить их клиенты.

1 лайк

Возвращаясь к вопросу создания компилятора паскаля на паскале. Нарыл вот интересный компилятор - http://mads.atari8.info/ . Весь исходный код на паскале. Вполне возможно, что после доработок откомпилируется и на PascalABC.NET

А не легче ли перевести исходники компилятора паскаля на паскаль?)) С C# на паскаль всё очень просто переводится. (Если не считать сколько там миллионов строк кода в этом компиляторе)

То что вы кинули, кстати, написано на 1 из старых паскалей (или, по крайней мере, в старом стиле). Компилироваться оно наверняка будет, но… Мне лично было бы легче с 0 переписать, чем с таким кодом работать.

И кроме того, компилятор на паскале найти не сложно. Вот, к примеру, мой. Но если синтаксис другой - то “пару моментов подредактировать” чтоб получился компилятор PascalABC.Net - не выйдет. Всё равно с 0 писать.

А чтоб научится - надо всегда сначала самому написать хоть что то а потом уже смотреть как то же самое реализовали другие. Иначе будет куча пробелов в знаниях.

Вопрос - зачем

3 лайка

Вот любите Вы неприличные вопросы задавать! :rofl:

Да, люблю

1 лайк

Тогда уж, скорее, риторические: Вы ведь и сами догадываетесь, зачем. )))

Мне тут понадобилось сделать кольцевой буфер, вроде задача тривиальная , а гугл ответ не сразу выдаёт(ну кроме учебных алгоритмов, лучше уж велосипед самому писать, чем такой в продакш) . Мой вариант во вложении. Что смутило при реализации.

  1. Есть ли в PascalABC.Net что-то типа move? А то для больших массивов поэлементное копирование такое себе удовольствие. Ну мне-то сойдёт для моих целей.
  2. А если нужно результат не в динамический , а в статический массив поместить? Что-то в отличие от Delphi с указателями на массивы проблемы определённые.

KBuf.rar (1,2 КБ)

System.Buffer. Но это работает только для стандартных типов.

Ещё вариант - создать динамическую функцию через System.Reflection.Emit, в IL вроде есть что то для такого копирования.

Не используйте статические массивы. Они хранят внутри динамический массив, но делают кучу лишних телодвижений. Да и JIT-у проще родные массивы оптимизировать.

Указатели на элемент массива нельзя получать через @a[...]. Эта конструкция разрешена для совместимости. Но она вызывает утечки памяти, а если элементы массива это записи с полем типа класса (как string) - ещё и небезопасно, сборщик мусора может в любой момент переместить массив и сломать указатель.

Используйте GCHandle чтоб блокировать массив напрямую и потом не забывайте разблокировать. Но если использовать это для копирования памяти между 2 массивами - будет всё равно медленно.

Это неверное утверждение. Статические массивы столь же эффективны по времени, что и динамические. Вы давно об этом говорите. Причём везде. Это неверно. Если надо использовать статические массивы, их можно использовать.

Конечно, лишаешься ряда преимуществ с огромным количеством методов. В этом - основная проблема статических массивов.

Да не сильно, они же тоже IEnumerable, значит вполне можно использовать методы последовательностей

var
  a: array[1..10] of integer := (9, 5, 3, 2, 7, 5, 4, 8, 9, 0);
  
begin
  a.PrintLines
end.

Только Intelisense не работает

System.Array.Copy

Да. В NET нельзя вот так просто напрямую обращаться к памяти, как в Delphi. Не используйте указатели. В статический массив у нас кроме как поэлементно ничего не скопируешь. Статические массивы сделаны для совместимости.