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

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

Как узнать размер Record? [D7, WinXP]


Cherepah ©   (2004-12-27 12:41:00) 

Уважаемые Мастера!
Имеется тип Record:
TData = record
   data1, data2 : integer;
   data3, data4 : string;
end;
Var
 Data: TData;

Необходимо узнать размер Data. Sizeof(Data) выдает ессно 16, а суммировать Sizeof(Data1)+...+Sizeof(DataN) не с руки - их много... Существуют ли другие способы подсчета?


Digitman   (2004-12-27 15:41:00) [1]


> Судя по комплиментам - это не возможно... А жаль!


свое "жалко" адресуй заодно и Борланду, ибо его братия тоже туда не влезла по причине "природной дубовости" ..
добрая половина его классов в составе VCL реализует подобные задачи ИМЕННО ТАК..


Fay   (2004-12-27 15:39:00) [2]

какой догадливый 8)


Cherepah   (2004-12-27 15:37:00) [3]


> Digitman ©   (27.12.04 15:22) [15]

Для тех, кто в него не влез:
> без подсчета в ручную суммы размеров всех элементов Record


Судя по комплиментам - это не возможно... А жаль!


Digitman   (2004-12-27 15:22:00) [4]


> Cherepah ©   (27.12.04 15:18) [14]


для тех кто на бронепоезде :
- размер дин.данных типа String определяется ф-цией length()
- размер стат.данных  базовых типов определяется оператором SizeOf


Cherepah   (2004-12-27 15:18:00) [5]


> DiamondShark ©   (27.12.04 15:10) [13]


Тогда повторяю вопрос. Можно ли узнать размер Record с такой структурой (пусть без битмап) без подсчета в ручную суммы размеров всех элементов Record? Повторюсь: фиксированный размер String в Record ставить не хочу...


DiamondShark   (2004-12-27 15:10:00) [6]


> Дело за малым: узнать фактический размер ее данных!

Для строк и массивов -- Length (для массивов * sizeof(element)).
Для других объектов -- зависит от самих объектов.

У битмапов, например, уже есть методы SaveToStream/LoadFromStream.
Главное как-то знать, что с этого места стрима начинается именно битмап.


Cherepah   (2004-12-27 15:07:00) [7]


> Digitman ©   (27.12.04 15:05) [11]
> для каждой переменной дин.типа сохранить в файле сначала
> факт.размер ее данных, а затем - сами данные ..


Нда... Это я и имел в виду... Дело за малым: узнать фактический размер ее данных!


Digitman   (2004-12-27 15:05:00) [8]

для каждой переменной дин.типа сохранить в файле сначала факт.размер ее данных, а затем - сами данные ..

при считывании из файла последовательность та же: считывание размера, иниц-ция переменной дин.типа с учетом полученного размера, считывавние в нее данных ранее считанного размера


Cherepah   (2004-12-27 15:02:00) [9]


> Это напрямую не прокатит, если есть длинные строки или динамические
> массивы, и, не дай Бог, объекты.


Каюсь в своей неосведомленности...

Тогда ситуация в делом:
Динамический массив из Record со структурой выше, возможно + TBitmap.

Как подобный массив можно сохранить/прочитать в файле?


Cherepah   (2004-12-27 15:01:00) [10]


> Это напрямую не прокатит, если есть длинные строки или динамические
> массивы, и, не дай Бог, объекты.


Каюсь в своей неосведомленности...

Тогда ситуация в делом:
Динамический массив из Record со структурой выше, возможно + TBitmap.

Как подобный массив можно сохранить/прочитать в файле?


Amoeba   (2004-12-27 14:53:00) [11]


> Как я понимаю, Возможно записать и считать BlockWrite/BlockRead-ом
> любой Record, если правильно указать его размер (для считывания).
>

Не совсем правильно понимаешь. Это напрямую не прокатит, если есть длинные строки или динамические массивы, и, не дай Бог, объекты.


Cherepah   (2004-12-27 14:49:00) [12]


> DiamondShark ©   (27.12.04 14:17) [6]

> Тогда твой вопрос не по теме твоей проблемы.


Мой вопрос часть моей проблемы...


> И BlockWrite/BlockRead-ом здесь не обойдёшься, ибо очевидно,
> что представление такой структуры в файле не является копией
> её в памяти.


Мне пока еще не очевидно. Как я понимаю, Возможно записать и считать BlockWrite/BlockRead-ом любой Record, если правильно указать его размер (для считывания). По крайней мере, с одиночным Record у меня получалось...
Размер Record мне требуется, чтобы указать в BlockRead для разбивки на Array of _Record_


DiamondShark   (2004-12-27 14:17:00) [13]


> Cherepah ©   (27.12.04 14:06) [5]

Тогда твой вопрос не по теме твоей проблемы.
Правильный вопрос: "Как сохранить/прочитать в файле структуры переменного размера".

И BlockWrite/BlockRead-ом здесь не обойдёшься, ибо очевидно, что представление такой структуры в файле не является копией её в памяти.


Cherepah   (2004-12-27 14:06:00) [14]

У меня этих Data 12 штук, некоторые из них бывают пустые. Record-ы в массиве с кучей элементов. Место теряется не сильно, но все-же... Не хочется. А если еще в Record картинку вставить с неизвестным размером...


PVOzerski   (2004-12-27 12:51:00) [15]

Ну да, ведь в поля record'ов попадают только указатели на 1-е элементы длинных строк.


Суслик   (2004-12-27 12:49:00) [16]


>  [2] Cherepah ©   (27.12.04 12:47)
> Data3-4 имеет кучу текста, и после BlockWrite-BlockRead
> неправильно считывает...

логично, блин.
Сделай не string, а string[255] например.


Cherepah   (2004-12-27 12:47:00) [17]

Data3-4 имеет кучу текста, и после BlockWrite-BlockRead неправильно считывает...


Суслик   (2004-12-27 12:44:00) [18]


> Sizeof(Data) выдает ессно 16

и правильно делает.

что тебя смущает?


Наверх

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