Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2011.11.13;
Скачать: CL | DM;

Вниз

Инициализация записей в массиве   Найти похожие ветки 

 
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;
Скачать: CL | DM;

Наверх




Память: 0.48 MB
Время: 0.01 c
2-1311114807
alexdn
2011-07-20 02:33
2011.11.13
Снять координаты курсора


2-1311508935
prodex
2011-07-24 16:02
2011.11.13
Как построить запрос в Oracle, если...


1-1272607489
alexvan
2010-04-30 10:04
2011.11.13
WordWrap в TMemo c фиксированным количеством строк


4-1251718295
d@vinchi
2009-08-31 15:31
2011.11.13
Создание оснастки (snap-in) для MMС?


1-1272628592
Яцхен
2010-04-30 15:56
2011.11.13
Как вывести форму на панельке или табшите другой формы?