Ошибки PascalABC.NET

У меня компилируется и запускается… Возможно у вас где то слишком большой путь к папке примеров, или что то типо того? Пробовали переустановить паскаль?

Переустановил, в ту же папку. Заработало =). Что там было я не понял. Но есть другой вопрос. Если те же два файла CallCS.pas и ClassLibrary1.dll скопировать в какую-нибудь другую папку и, не закрывая паскаля, после запуска первого CallCS.pas из примеров, открыть и запустить второй, который в другой папке, то выдает ошибку. Не знает что такое Class1.

Ерунда какая-то. В любой папке всё работает

Надо не закрывая первый файл.

А, дело в том, какой файл сделан активным:

Ту issue редактировать или новую делать?

Да, увидел. Сделайте новую Issue и четко опишите последовательность действий

Итак, вопрос к разработчикам. Какие методы/классы в PABCSystem.pas и PABCExtensions.pas являются критичными для работы компилятора? Я попытался очистить содержимое обоих модулей и получил следующую ошибку:

А вообще ведь должна быть где-то лазейка для отключения в компиляторе этих двух модулей! Вы ведь не могли здесь сделать настолько глубокую привязку! :slight_smile: Я надеюсь, что это возможно. Обидно, что при написании программ я не использую ничего из стандартных средств - чистый .NET, а в исполнимый файл всё равно кидается всякий хлам. Тем более, на форуме уже у кого-то была проблема из-за этих модулей. Может и правда, сделаете директиву/настройку? :wink:

P. S. А проблема была с dll-кой. В неё не смогли скомпилировать метод Init(или что-то типа того) именно из-за того, что метод с таким названием объявлен в PABCSystem. А ещё при декомпиляции приложения кто-то утонул в именах с приставкой PABC и древних ReadLn, WriteLn и т.п.

А она (глубокая привязка) таки есть, ни раз поднимали эту тему и последний раз на этом и закончили…

Вот смотрите на программу которую генерирует (я декомпилировал программу, состоящую из begin end.). Там идёт настройка для всего, что нужно для работы writeln и т.п. Если writeln не используется - его может и не добавляет в .exe файл, но заполнение внутренних переменных из модуля PABCSystem не уберёт. Не на столько хорошая оптимизация проводится…

PABCSystem имеет своё пространство имён (два*), так что это не могло стать проблемой. Если мы оба говорим про робокод - я запомнил что там проблема была в том, что паскаль стал запихивать написанный код в какой то дополнительный класс/пространство имён и разработчики робокода не сумели его оттуда достать.

Ну так может попытаться начать ещё раз или продолжить? :slight_smile:

Вот и я об этом. Я не использую ничего из стандартного(то бишь из PABCSystem.pas), даже OMP уже заменил на Tasks.Parallel, но в программе/dll всё равно полно хлама, который там никак не нужен.

Исходя из размера .exe файла, туда добавляется всё содержимое PABCSystem. Про внутренние переменные уже написал выше. Это я так понимаю System.Random для рандома, DateTime для milliseconds/millisecondsDelta? Ну, сейчас даже такую ленивую для собственноручной реализации функцию как milliseconds, я уже пишу в программе самостоятельно, не говоря уже о Random. Просто переходить на C# только из-за мусора в exe из PABCSystem мне очень не хочется. Тем более, тут не нужно удалять из exe ненужное, уже предлагали просто не совать туда это(во всяком случае я, хотя и Вы тоже что-то подобное предлагали). Попросить разработчиков добавить директиву компилятора, отключающую чтение всех стандартных модулей в режиме без связи с оболочной(системные модули обеспечивают эту связь, следовательно без них её просто быть не может).

Наткнулся на просторах Интернет при обсуждении школьного языка КУМИР:

Мы обращались в фирму 1С с предложением ввести в язык (речь идет о версии 6.0) следующие конструкции:
ПОЧЕМУ БЫ И НЕ — проверяет условие еще раз (самый частый глюк старой 1С)
НЕПРЕМЕННО — выполняет оператор без сбоев и зависаний
ОТНЫНЕ — присваивает значение переменной так, чтобы оно там действительно оказалось. (присвоить переменной вида, к примеру, «Справочник» значение в языке 1С — порой очень непростая задача, иногда требующая конструкции аж из 4-х операций)
ВО ЧТО БЫ ТО НИ СТАЛО — выводит текст отчета который без этого оператора выводится через раз.
НЕ СПАТЬ — отключает внутренний глюкогенератор
Я СКАЗАЛ — выполняет команду до тех пор, пока она не выполнится.
ИМЕТЬ СОВЕСТЬ — приостановить выполнение команды при её зависании.
Почему-то фирма не прислушалась к нашему мнению..
2 лайка
{$faststrings}
{$string_nullbased+}
begin
  var A := 'abc';
  A.Chars[0].Println();
  A.Chars[0] := 'd'; // Не работает.
  A.Println();
end.

Но почему же тогда в справке: {$faststrings} - строки с быстрым доступом к символам на запись, но со ссылочной семантикой? Это разве не про то, что можно напрямую символы перезаписывать?

Вам же так и пишет, свойство Chars не имеет поля для записи.

Так работает:

{$faststrings}
{$string_nullbased+}
begin
  var A := 'abc';
  A[0].Println();
  A[0] := 'd';
  A.Println();
end.

А те директивы ни при чём, и без них должно работать так и только так.

1 лайк

Хорошо, понял.

В новой версии 3.3.5.1669 происходит ошибка компиляции шахмат game2.pas

game2.pas(61) : Несколько подпрограмм могут быть вызваны

Я ещё обратил внимание, когда смотрел что-то на GitHub, что прошёл коммит ABCPascal.y с изменением в const_variable, где была закомментирована часть с tkRoundOpen const_expr tkRoundClose. Может и не связано, но всё равно непонятно зачем.

Да, оно даёт конфликт в грамматике