Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Начинающим";
Текущий архив: 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.003 c
15-1311009842
istok
2011-07-18 21:24
2011.11.13
что может приводить к проблемам с клавой..?


2-1311252544
petka
2011-07-21 16:49
2011.11.13
Инициализация записей в массиве


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


15-1310761791
Юрий
2011-07-16 00:29
2011.11.13
С днем рождения ! 16 июля 2011 суббота


2-1311149076
Scott Storch
2011-07-20 12:04
2011.11.13
ошибка при работе с параметрами запроса





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский