Жду исправлений.
Кажись, новый баг нашел: если написать:
//uses System;
const
Path = 'C:\Файлы\Уроки\Алгоритмизация\Вариант 511.txt';
type
///Тип детали.
TDetail = record
private
_Name: string;
_Weight: integer;
_IsPresent: boolean;
public
///Имя
property Name: string read _Name write _Name;
///Вес
property Weight: integer read _Weight write _Weight;
///Состоянее
property IsPresent: boolean read _IsPresent write _IsPresent;
constructor(name_: string; weight_: integer; isPresent_: boolean);
begin
Name := name_;
Weight := weight_;
IsPresent := isPresent_;
end;
///Возвращает строковое представление объекта типа TDetail.
function ToString() := Format('Detail: (Name: {0}, Weight: {1}, State: {2}).', _Name, _Weight, _IsPresent);
end;
begin
var Details := ReadAllLines(Path).Select(x ->
begin
var l := x.ToWords();
try
Result := new TDetail(l[0], StrToInt(l[1]), l[2] = 'true')
except on System.FormatException do
Writeln('Ошибка: неверный формат входных данных.');
end;
end);
Details.Where(x -> (x.Weight > 10) and (x.Weight < 50)).Select(x -> x.ToString()).JoinIntoString(NewLine).Println();
Details.Where(x -> not x.IsPresent).Select(x -> x.ToString()).JoinIntoString(NewLine).Println();
end.
Неожиданное: Вариант 511.pas(38) : В данной версии компилятора не поддерживается замыкание данного типа символов, однако если раскомментировать строку 1, то все работает.
Вот вариант без лишнего, только давайте вы сами попробуете лишнее убрать в следующий раз:
//uses System;//если раскомментировать - ошибки нет
begin
var a: ()->() := ()->
try
except
on System.InvalidCastException do//любой исключение из system
end;
end.
@Admin это ошибка или нет? Может хотя бы сделать более информативно?
Хорошо, в следующий раз буду убирать лишнее.
Это не ошибка. К сожалению, это слабый алгоритм анализа нелокальных имён в лямбдах, которые лямбда естественно хочет захватить. Для всего, что алгоритм не может отклассифицировать, он выдаёт ошибку об имени, которое не может захватить. Информативнее это сделать трудно - этот алгоритм и так сложный - и как раз если бы он знал, что такое System на тот момент, то и код бы сгенерировал. Когда Вы пишете uses, это ему подсказка, и он классифицирует System.
А можете улучшить алгоритм анализа? Я понимаю, что нелегко - но хотя бы попытаться же можно и при удачной попытке обновление сделать PABC.Net. Текст ошибки не очень информативный, кстати: В данной версии компилятора не поддерживается замыкание данного типа символов.
@Admin так а всё же, вы сказали что эти операторы нельзя расширять для integer
хотя их можно, и по аналогии с делегатами это следовало бы запретить. То что следующий код компилируется это ошибка?
function operator+(i1, i2: integer): integer; extensionmethod;
begin end;
function integer.operator*(i1, i2: integer): integer;
begin end;
begin end.
С++ вот к примеру запрещает перезагружать операторы 2 вшитыми типами, даже если это новая пара (как int
и double
).
Добрый день. Возникла проблема, с которой ни разу не сталкивались. Слушатель курсов переподготовки установил несколько версий 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?