Поэтому я всегда слышал, что поля класса (на основе кучи) были инициализированы, а переменные на основе стека - нет. Я также слышал, что члены записи (также основанные на стеке) также не были инициализированы. Компилятор предупреждает, что локальные переменные не инициализированы ([DCC Warning] W1036 Переменная 'x', возможно, не была инициализирована), но не предупреждает об элементах записи. Поэтому я решил провести тест.
Я всегда получаю 0 от Целые числа и false от Booleans для всех участников записи.
Я пытался включать и выключать различные параметры компилятора (отладка, оптимизация и т. Д.), Но разницы не было. Все мои записи участников инициализируются.
Что мне не хватает? Я на Delphi 2009 Обновление 2.
program TestInitialization;
{$APPTYPE CONSOLE}
uses
SysUtils;
type
TR = Record
Public
i1, i2, i3, i4, i5: Integer;
a: array[0..10] of Integer;
b1, b2, b3, b4, b5: Boolean;
s: String;
End;
var
r: TR;
x: Integer;
begin
try
WriteLn('Testing record. . . .');
WriteLn('i1 ',R.i1);
WriteLn('i2 ',R.i2);
WriteLn('i3 ',R.i3);
WriteLn('i4 ',R.i4);
WriteLn('i5 ',R.i5);
Writeln('S ',R.s);
Writeln('Booleans: ', R.b1, ' ', R.b2, ' ', R.b3, ' ', R.b4, ' ', R.b5);
Writeln('Array ');
for x := 0 to 10 do
Write(R.a[x], ' ');
WriteLn;
WriteLn('Done . . . .');
except
on E:Exception do
Writeln(E.Classname, ': ', E.Message);
end;
ReadLn;
end.
Выход:
Testing record. . . .
i1 0
i2 0
i3 0
i4 0
i5 0
S
Booleans: FALSE FALSE FALSE FALSE FALSE
Array
0 0 0 0 0 0 0 0 0 0 0
Done . . . .