Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Основная";
Текущий архив: 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
1-1104831450
markers
2005-01-04 12:37
2005.01.16
Del в TListView


14-1104070822
Genry
2004-12-26 17:20
2005.01.16
Работа с bat-файлом


1-1104386706
Бизон
2004-12-30 09:05
2005.01.16
Свой хелп


4-1101570433
Георгий
2004-11-27 18:47
2005.01.16
автоматическое выключение компъютера


14-1104227771
Empleado
2004-12-28 12:56
2005.01.16
Скопировать CD





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский