Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

Инициализация записей в массиве


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] конечно же, пример кода писал прямо тут, поэтому могут быть опечатки.


Наверх

Титульная страница Поиск, карта сайта Написать письмо