Замечания и предложения

Да, Вы правы. Признаю, ошибся.

Кроме того, это будет ещё и медленнее.

Ну, этот пример правильный, но не все константы - это что то с известным заранее значением. Константы - это так же то, что нельзя менять после инициализации.

14 сообщений перенесены в тему Болталка PascalABC.NET

23 сообщения перенесены в тему Болталка PascalABC.NET

Вопрос касательно справки. Почему в списке удалённых из языка конструкций числится library, in, abstract и default?

Ошибка должно быть. В языке они присутствуют.

Вот и я говорю. @Admin, обратите внимание.

type
  TClass = class // Или record.
    const c = 0;
  end;

begin
end.

Там же, в разделе Отсутствует->Пункт 13:

Константы-поля классов.

Пример программы доказывает абсолютно обратное.

Кстати, почему об этом в справке ничего не сказано:

type
  TA<T> = class
  end;
  
  TB<T> = class(TA<T>)
  end;
  
begin
  var x := new TB<byte>();
  var y := x as TA<byte>;
  var z := TA&<byte>(x); // <-- Можно
end.

?

Вот так попробуйте:

var z := TA&<byte>(x);

Спасибо.

Если элемент массива не инициализировать при прочетнии его элемента будет выдаваться ошибка. Это баг или фича(с учётом того, что все типы тут классы)?

какого типа элемент?

Это если объявить Functions : array [0…10] of array of string;

То там где присвоения не было по идее должны быть массив нулевой длинны. А на деле отладчик пишет что там nil Но исполнение самой программы таки правильно - это у меня ошибка в коде оказалась. Если ставить проверку Length(Functions[j])>0 - то нормально отрабатывает. Вот как я себе представляю оргазизацию дин. массив в Delphi - http://4.bp.blogspot.com/-jilcCFolsYc/T2j2b-L1QWI/AAAAAAAAARk/ynvgzGDDPjE/s1600/Dynamic-Array-In-Memory.png При ней nil быть не может даже для нулевого числа элементов.

Вот реализация Length:

function Length(a: &Array): integer;
begin
  if a = nil then
    Result := 0
  else Result := a.Length;
end;

Насчёт той диаграммы по ссылке - я не понял что она означает. Но в .Net у всех ссылочных типов значение по умолчанию - nil.

В паскале есть всего несколько типов реализованных по особому. К примеру типизированные файлы - это ссылочные типы, но паскаль всегда инициализирует их сам, поэтому они не могут быть nil. И это только ради совместимости со старыми паскалями.

Но массив - это стандартный .Net -овский тип. Если у него значение поумолчанию будет не nil - это сломает совместимость с .Net .

Это больше звучит как будто это будет выдавать ошибку:

begin
  var a: array[1..2] of array of byte;
  writeln(a[1]);
end.

Это выводит nil. Но, на сколько я понял, вы имеете в виду этот случай:

begin
  var a: array[1..2] of array of byte;
  writeln(a[1][0]);
end.

Но, даже если бы массив всегда инициализировался массивом с 0 элеметов - это всё равно выдало бы ошибку, потому что тут индекс выходит за границы.

Статический массив динамических массивов? Ммм, это что-то новенькое :smile:

[quote=“Sun_Serega, post:1044, topic:143”] Насчёт той диаграммы по ссылке - я не понял что она означает. [/quote] - это как в дельфи динамический массив объявляется в памяти. 1-й элемент , сколько раз на него сослались. 2-й элемент - длинна массива. 3-й и последующий(имеют объявленный типа) - это уже собственно элементы массива.

[quote=“Sun_Serega, post:1044, topic:143”] Но, даже если бы массив всегда инициализировался массивом с 0 элеметов - это всё равно выдало бы ошибку. [/quote] -да, в моём случае точно бы выдало. Я попробую какой-нибудь тестовый пример создать , может действительно по исполнению это всегда будет эквивалентно.

1 лайк

Недавно на форуме обсуждали возможность установки значка на исполняемый файл, генерируемый компилятором PABC.NET. Это оказалось достаточно простой манипуляцией, но проводить её каждый раз при обновлении очень неудобно. Я хотел бы предложить разработчикам добавить такую возможность непосредственно в компилятор. Оформить это можно директивой вида {$AppIcon 'Icon.ico'}, либо параметром в настройках компилятора.

2 лайка