![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Инициализация записей в массиве
petka © (2011-07-21 16:49:00)Добрый день.
Имеется вопрос о инициализации записей в массиве.
Привожу код:
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 17:06:00) [1]
> Rouse_ ©
Спасибо за более подробный ответ.
Единственный нормальный хелп был у Delphi 7 и ниже, в хелпе новых версий вообще черт ногу сломит, да и вечно он сам не завершает работу при его закрытии, приходилось убивать процесс хелпа, иначе не давал комп отключить.
MBo (2011-07-21 16:57:00) [2]Из хелпа 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:00) [3]
SetLength(MyArray, 10);
Finalize(MyArray);
ZeroMemory(@MyArray[0], SizeOf(TMyRec) * Length(MyArray));
Хотя есть несколько нюансов, например в Delphi 2007 и выше SetLength сам инициализирует нулем выделенную память и ZeroMemory/FillChar не нужно.
Finalize именно в таком коде лишний, т.к. еще не был произведен доступ к любому из динамических элементов массива (в данном случае здесь им выступает строка), но при последующих инициализациях забывать данный вызов нельзя, иначе получим мемлик из-за затертого указателя.
Игорь Шевченко (2011-07-21 16:56:00) [4]
> или это все же делает неявно сама SetLength?
RTFS: System.pas, DynArraySetLength
petka (2011-07-21 16:50:00) [5]в последней части кода там MyArray[i] конечно же, пример кода писал прямо тут, поэтому могут быть опечатки.