Форум: "Начинающим";
Текущий архив: 2011.11.13;
Скачать: [xml.tar.bz2];
ВнизИнициализация записей в массиве Найти похожие ветки
← →
petka (2011-07-21 16:49) [0]Добрый день.
Имеется вопрос о инициализации записей в массиве.
Привожу код:
type
TMyRec = record
Boolval: Boolean;
Value: integer;
Data: string;
end;
procedure TForm1.FormCreate(Sender: TObject);
var MyArray: array of TMyRec;
begin
SetLength(MyArray, 10);
//инициализируем FillChar-ом
FillChar(MyArray, ..., 0);
//или так
for i := Low(MyArray) to High(MyArray) do
begin
MyArray[0].Boolval := False;
MyArray[0].Value := 0;
MyArray[0].Data := "";
end;
end;
Так вот вопрос, надо ли инициализировать поля записей в массиве или это все же делает неявно сама SetLength? При отладке видно, что все чисто, без какого-либо мусора в полях и без явно инициализации показанной в коде выше. Знаю, что дельфи инициализирует содержимое классов и глобальные переменные, а вот об этом случае ничего не нашел, поэтому и не знаю гарантировано ли, что поля записей в массиве будут инициализированы. Использую Delphi XE.
← →
petka (2011-07-21 16:50) [1]в последней части кода там MyArray[i] конечно же, пример кода писал прямо тут, поэтому могут быть опечатки.
← →
Игорь Шевченко © (2011-07-21 16:56) [2]
> или это все же делает неявно сама SetLength?
RTFS: System.pas, DynArraySetLength
← →
MBo © (2011-07-21 16:57) [3]Из хелпа 2006:
...when increasing the length of a dynamic array in which the elements are types that must be initialized (strings, Variants, Variant arrays, or records that contain such types). When S is a dynamic array of types that must be initialized, newly allocated space is set to 0 or nil.
из docwiki - надо полагать, в XE-овом хелпе то же самое написано:
http://docwiki.embarcadero.com/VCL/en/System.SetLength
For a dynamic array variable, SetLength reallocates the array referenced by S to the given length. Existing elements in the array are preserved and newly allocated space is set to 0 or nil.
← →
Rouse_ © (2011-07-21 16:57) [4]
SetLength(MyArray, 10);
Finalize(MyArray);
ZeroMemory(@MyArray[0], SizeOf(TMyRec) * Length(MyArray));
Хотя есть несколько нюансов, например в Delphi 2007 и выше SetLength сам инициализирует нулем выделенную память и ZeroMemory/FillChar не нужно.
Finalize именно в таком коде лишний, т.к. еще не был произведен доступ к любому из динамических элементов массива (в данном случае здесь им выступает строка), но при последующих инициализациях забывать данный вызов нельзя, иначе получим мемлик из-за затертого указателя.
← →
petka (2011-07-21 17:06) [5]
> Rouse_ ©
Спасибо за более подробный ответ.
Единственный нормальный хелп был у Delphi 7 и ниже, в хелпе новых версий вообще черт ногу сломит, да и вечно он сам не завершает работу при его закрытии, приходилось убивать процесс хелпа, иначе не давал комп отключить.
Страницы: 1 вся ветка
Форум: "Начинающим";
Текущий архив: 2011.11.13;
Скачать: [xml.tar.bz2];
Память: 0.45 MB
Время: 0.004 c