Добрый день. Возникла проблема, с которой ни разу не сталкивались. Слушатель курсов переподготовки установил несколько версий 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;
Другое дело, что при этом будет иная ошибка, но тут уж сами смотрите, что накодировали…
Хорошо, допустим, я экранировал, но как избавиться от: () : Внутренняя ошибка компилятора в модуле [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
может использоваться для элементов класса, но они не нужны для вызова ошибки.
А ошибок компиляции даже в неадекватном коде не должно быть.