![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Как узнать размер 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
и правильно делает.
что тебя смущает?