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

Вниз

Как узнать размер Record?   Найти похожие ветки 

 
Cherepah ©   (2004-12-27 12:41) [0]

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

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


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


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

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

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


 
Cherepah ©   (2004-12-27 12:47) [2]

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


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


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

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


 
PVOzerski ©   (2004-12-27 12:51) [4]

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


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

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


 
DiamondShark ©   (2004-12-27 14:17) [6]


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

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

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


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


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

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


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


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


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


 
Amoeba ©   (2004-12-27 14:53) [8]


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

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


 
Cherepah ©   (2004-12-27 15:01) [9]


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


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

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

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


 
Cherepah ©   (2004-12-27 15:02) [10]


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


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

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

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


 
Digitman ©   (2004-12-27 15:05) [11]

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

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


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


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


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


 
DiamondShark ©   (2004-12-27 15:10) [13]


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

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

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


 
Cherepah ©   (2004-12-27 15:18) [14]


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


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


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


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


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


 
Cherepah ©   (2004-12-27 15:37) [16]


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

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


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


 
Fay ©   (2004-12-27 15:39) [17]

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


 
Digitman ©   (2004-12-27 15:41) [18]


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


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



Страницы: 1 вся ветка

Текущий архив: 2005.01.16;
Скачать: CL | DM;

Наверх




Память: 0.51 MB
Время: 0.741 c
1-1104175889
NeedHelp
2004-12-27 22:31
2005.01.16
Vopros lenjaja =)) o funkcie try .... except


1-1103911798
Guitar
2004-12-24 21:09
2005.01.16
Ошибка I/O error 102. Что за ошибка и как убрать?


3-1103012079
MgFox
2004-12-14 11:14
2005.01.16
ADO Connection String не создается


8-1097334766
DL
2004-10-09 19:12
2005.01.16
Преобразование массива в bitmap


1-1104151339
MTsv DN
2004-12-27 15:42
2005.01.16
Рекурсивный проход дерева каталогов