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

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

Память, занимаемая массивом, содержащим дин. массивы.


Fenik ©   (2005-02-24 20:48:00) 

Есть динамический массив A: array of TRecord;
Можно ли определить число байт занимаемое им в памяти, не проходя циклом по массиву? И будет ли это быстрее и надежнее чем вариант с циклом?


type
 TDataPoint = packed record
   X: Word;
   Y: Word;
 end;

 TRecord = packed record
   DataType: TDataType;     // тип снимаемых данных
   FibreType: TFibreType;   // тип волокна
   GrindDegree: Byte;       // степень помола, °ШР
   Concentration: Single;   // концентрация, %
   Height: Word;            // высота внутреннего цилиндра, мм
   InternalRadius: Word;    // внутренний радиус внешнего цилиндра, мм
   ExternalRadius: Word;    // внешний радиус внутреннего цилиндра, мм
   Commentary: string;      // комментарий
   DataPoint: array of TDataPoint;
   AproximatePoint: array of TDataPoint;
 end;


Anatoly Podgoretsky   (2005-02-24 21:39:00) [1]

Без цикла здесь ни как, хорошо что еще рекурсивных структур нет.


Fenik   (2005-02-24 21:21:00) [2]

>begin...end ©  (24.02.05 21:07) [8]

С записью в файл и чтением из него проблем нет. Думал, может быть существует метод быстрого определения размера, которое будет занимать файл. Но, как я понял, такого метода нет, и придется оставить старый вариант с перебором всех элементов A.
Спасибо за помощь. )


begin...end   (2005-02-24 21:07:00) [3]

> Fenik   (24.02.05 21:01) [5]

> Мне нужен объем массива плюс объемы всех подмассивов.

Тогда найдите размер каждого подмассива (см. [2]) и просуммируйте их.

> Т.е. если массив A со всеми данными записать в файл,
> сколько памяти он займет.

Такой массив в файл Вы просто так не запишете. Придётся для каждого элемента отдельно записывать каждое поле так, как этого хотите Вы. Более того - в TRecord есть также string-поле - с ним как быть? Ведь оно тоже занимает 4 байта.


Fenik   (2005-02-24 21:05:00) [4]

> DiamondShark ©  (24.02.05 21:03) [6]
> Тогда только проходясь по всем элементам.


Ясно.
Спасибо.


DiamondShark   (2005-02-24 21:03:00) [5]

Тогда только проходясь по всем элементам.


Fenik   (2005-02-24 21:01:00) [6]

>begin...end ©  (24.02.05 20:51) [2]

Мне нужен объем массива плюс объемы всех подмассивов.
Т.е. если массив A со всеми данными записать в файл, сколько памяти он займет.


begin...end   (2005-02-24 20:53:00) [7]

Примечание: разумеется, в [2] я имел в виду суммарный объём памяти, занимаемый элементами массива A. Размер самой переменной массива A равен 4 байтам.


Anton_K   (2005-02-24 20:52:00) [8]

Эээ... да, что-то я не то сказал... извиняюсь.


Anton_K   (2005-02-24 20:51:00) [9]


var A:array of TRecord;
Size:Cardinal;
...
Size:=SizeOf(A)
...


begin...end   (2005-02-24 20:51:00) [10]

> Fenik   (24.02.05 20:48)

Размер переменной типа TRecord не зависит от количества элементов в поле-массиве TRecord.DataPoint.

> Есть динамический массив A: array of TRecord;
> Можно ли определить число байт занимаемое им в памяти,
> не проходя циклом по массиву?

Можно. BytesCount := Length(A) * SizeOf(TRecord). Для уверенности объявите A как packed array.


Наверх

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