Да, Вы правы. Признаю, ошибся.
Кроме того, это будет ещё и медленнее.
Ну, этот пример правильный, но не все константы - это что то с известным заранее значением. Константы - это так же то, что нельзя менять после инициализации.
Вопрос касательно справки. Почему в списке удалённых из языка конструкций числится library
, in
, abstract
и default
?
Ошибка должно быть. В языке они присутствуют.
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 элеметов - это всё равно выдало бы ошибку, потому что тут индекс выходит за границы.
Статический массив динамических массивов? Ммм, это что-то новенькое
[quote=“Sun_Serega, post:1044, topic:143”] Насчёт той диаграммы по ссылке - я не понял что она означает. [/quote] - это как в дельфи динамический массив объявляется в памяти. 1-й элемент , сколько раз на него сослались. 2-й элемент - длинна массива. 3-й и последующий(имеют объявленный типа) - это уже собственно элементы массива.
[quote=“Sun_Serega, post:1044, topic:143”] Но, даже если бы массив всегда инициализировался массивом с 0 элеметов - это всё равно выдало бы ошибку. [/quote] -да, в моём случае точно бы выдало. Я попробую какой-нибудь тестовый пример создать , может действительно по исполнению это всегда будет эквивалентно.
Недавно на форуме обсуждали возможность установки значка на исполняемый файл, генерируемый компилятором PABC.NET. Это оказалось достаточно простой манипуляцией, но проводить её каждый раз при обновлении очень неудобно. Я хотел бы предложить разработчикам добавить такую возможность непосредственно в компилятор. Оформить это можно директивой вида {$AppIcon 'Icon.ico'}
, либо параметром в настройках компилятора.