Ошибки PascalABC.NET

Добрый день. Возникла проблема, с которой ни разу не сталкивались. Слушатель курсов переподготовки установил несколько версий PascalABC.NET на свой ноут, и все время получает ошибку: Ошибка чтения PCU файла ‘C:\Program Files (x86)\PascalABC.NET\Lib__RedirectIOMode.pcu’. Работать не может. Чем можно помочь? У нее Windows 8 (как сказала).

Ну, дык, пусть снесёт всё и поставит одну… Желательно последнюю ;–)

Такая ошибка происходит когда pcu одной версии используется в другой версии. Конечно, можно всё снести и переустановить в новый каталог. Ещё можно перекомпилировать RedirectIOMode.pas на этой машине и положить получившийся pcu в папку lib

Похоже, для „глухого телефона“ ТС vs „как сказала“, это не вариант ;–)

Спасибо, попробуем.

Да, не очень понял. Если PascalABC.NET на машине не работает, то как перекомпилировать RedirectIOMode.pas? Да, и еще. Все началось, что установили последнюю версию. Потом уже ставили другие… Снося предыдущие…

Перекомпилировать, нажав кнопочку компиляции, а не запуска.

Если не работает - это плохо, надо понять, в чем дело. Во-первых, работает ли последняя версия на других машинах? На Вашей? Во-вторых, не надо ничего сносить - инсталлировать в чистый каталог и создать программу не в рабочем каталоге, а скажем в d:\W. Ошибка сохраняется или нет?

Это баг?

type
  a<T>=class 
    public class l: integer; 
  end;

begin
  a<integer>.l:=9; 
end.

Код даже не форматируется: Program1.pas(7) : Встречено ‘<’, а ожидалось ‘;’.

А что это вообще? Зачем тут < T > в описании класса? Но это и не баг, ибо сказано многократно: в этих случаях надо экранировать <, чтобы не выглядело операцией отношения, т.е. писать a&<integer>.l:=9; Другое дело, что при этом будет иная ошибка, но тут уж сами смотрите, что накодировали…

1 лайк

Хорошо, допустим, я экранировал, но как избавиться от: () : Внутренняя ошибка компилятора в модуле [pabcnetc.exe] :‘System.Exception: System.NotImplementedException: Метод или операция не реализована. в System.Reflection.Emit.FieldOnTypeBuilderInstantiation.get_FieldType() в PascalABCCompiler.NETGenerator.ILConverter.AssignToStaticField(IExpressionNode to, IExpressionNode from) в PascalABCCompiler.NETGenerator.ILConverter.ConvertStatement(IStatementNode value) в PascalABCCompiler.NETGenerator.ILConverter.visit(IStatementsListNode value) в PascalABCCompiler.NETGenerator.ILConverter.ConvertBody(IStatementNode body) в PascalABCCompiler.NETGenerator.ILConverter.ConvertFunctionBody(ICommonFunctionNode func) в PascalABCCompiler.NETGenerator.ILConverter.ConvertFunctionsBodies(ICommonFunctionNode[] funcs) в PascalABCCompiler.NETGenerator.ILConverter.ConvertFromTree(IProgramNode p, String TargetFileName, String SourceFileName, CompilerOptions options, String[] ResourceFiles) в PascalABCCompiler.Compiler.Compile()’?

Вы не ответили на первый вопрос - зачем Вам < T >, если Вы его не используете? Или, как я уже приводил тот анекдот, Вы тоже из тех мужиков, что пилу рельсой испытывали?

Просто для тестирования. И почему должна вылетать ошибка, если я просто не использую T?

    namespace Test
    {
        public class A<T>
        {
            public static int l;
        }

        class Program
        {
            static void Main(string[] args)
            {
                A<int>.l = 1;
            }
        }
    }

Например, компилируется, даже если T не используется.

Почему ошибка - это к разработчикам. Возможно компилятор не понимает, куда он должен производить инстанцирование этого Вашего integer.

Вы периодически забываете, что это Паскаль, а не С++ и не надо из него С++ сделать пытаться, как не надо пытаться добиться от него, чтобы всякая, простите, фигня, которая в С++ допустима, была допустима и тут. В данном случае это как если Вы по дорогу домой заодно подберете урну с мусором, которая Вам сто лет не снилась, и будете с нею в обнимку до дверей квартиры идти, а потом бросите.

Я уважаю разработчиков как людей, но хотелось бы чтобы компилятор изменился в лучшую сторону, а то получается, что даже верный код (синтаксически) не компилируется.

Да, кстати, в коде был C#.

А что, этот код нельзя в С++ набрать?

Я не спорю, что можно, просто я в Visual Studio 2017 проверял.

Кстати, это тоже не компилируется:

type
  a<t>=class 
    public class l: T; 
  end;

begin
  a&<integer>.l := 9; 
end.

Тогда указывайте, что это С#, а то получается, что пишете код, я на него ссылаюсь, а Вы начинаете рассказывать, что “язык не тот”.

Хорошо, учту на будущее.

Всё правильно он сделал, он оставил только то что нужно для вызова ошибки. T может использоваться для элементов класса, но они не нужны для вызова ошибки.

А ошибок компиляции даже в неадекватном коде не должно быть.

1 лайк