Форум: "Основная";
Текущий архив: 2005.01.16;
Скачать: [xml.tar.bz2];
ВнизКак узнать размер 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;
Скачать: [xml.tar.bz2];
Память: 0.49 MB
Время: 0.045 c