Ошибки компилятора PascalABC.Net

Я не работал с классами в FPC и Delphi, но думаю, что в таком именно виде - вряд ли )))

Я про то что статичный ацессор у не_статичного поля.

Это лучше к @Admin. Я экзотику предпочитаю стороной обходить. Или, иначе, просто не пишу подобные вещи, поэтому и не могу тут что-то сказать определенное. Ну вот такая у меня позиция: непонятно - не используй, тем более, что большого выигрыша от именно такой конструкции я не вижу. Должна работать - пусть работает, не должна - ну и бог с ней… )))

Ну, у вас же установлены старые паскали, разве нет?

Нет, конечно, зачем мне хлам?))) FPC можете попробовать сами: выберите Pascal FPC (3.0.0)

Но по-моему там все же иной синтаксис.

Добрый день. Наткнулся под ALT Linux на ошибку, идентичную описанной в исходной ветке обсуждения. Что до mono-full vs mono-complete: в Альте последнего нет, как нет и libmono-system-numerics. Кто-нибудь побеждал подобное? Поделитесь, пожалуйста, рецептом.

Use the source, Luke!

begin
  var s: Set of Integer;
  Include(s, ReadInteger);
end.

Ошибка времени выполнения: System.InvalidProgramException: Среда выполнения Common Language Runtime обнаружила недопустимую программу.
Стек:
   в Program4.Program.$Main()
   в Program4.Program.Main()

Да, исправим.

Пока пишите

begin
  var s: Set of Integer;
  Include(s, ReadInteger());
end.

Спасибо

begin
  var s := 1.2-[2,3];//Ошибка: Операция 'dunmin' не применима к типам real и set of integer
end.

Что за dunmin? Так и должно писать?

Напишите в Issue

“Невозможно вывести типы-параметры generic-подпрограммы ReadElements (укажите типы-параметры явно)” Или может быть я неправильно пишу эту функцию?

begin
  var f1: file of integer;
  Rewrite(f1, 'a.dat');
  Write(f1, 1, 2, 3, 4, 5);
  f1.Close;
  ReadElements('a.dat').Println;//ошибка
end.

Ну, вам правильно пишет, надо указывать параметры шаблона явно:

function f1<T>: T := default(T);

begin
  var a := f1<byte>;
end.

Тут уже выдаёт другую ошибку. Проблема в том что компилятор думает что вы сравниваете указатель на функцию f1 и типа byte оператором <. А затем сравниваете результат с ничем. Поэтому пишет что ожидалось выражение вместо ; то есть то с чем можно сравнить.

В этом случае нужно экранировать первый <, то есть поставить перед ним & (этот знак под семёркой в англ раскладке). Тогда компилятор не сможет считать < оператором сравнения, и всё скомпилируется правильно.

1 лайк

Да, так работает ReadElements&<integer>('a.dat').Println;

begin
  loop 10 do
  begin
    var i: integer;
    writeln(i);
    i += 1;
  end;
end.

i обнуляется только в первой итерации цикла. @Admin, это ошибка?

В1 лекции повышение квалификации преподавателей об этом что-то есть https://youtu.be/U65-SebSaj4?t=5430

Там переменной присваивается сразу новое значение, поэтому обнуление и не нужно.

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

Это внутренности реализации компилятора. Знание их не должно быть обязательным для программирования.