Наши проекты:
Журнал · Discuz!ML · Wiki · DRKB · Помощь проекту |
||
ПРАВИЛА | FAQ | Помощь | Поиск | Участники | Календарь | Избранное | RSS |
[3.145.178.157] |
|
Страницы: (3) 1 [2] 3 все ( Перейти к последнему сообщению ) |
Сообщ.
#16
,
|
|
|
Ты скажи мне, фундаментальный тип всегда останется неизменного размера? Уверен в том? |
Сообщ.
#17
,
|
|
|
Write заменить на WriteBuffer а по поводу SizeOf есть вот такой вопросик:
SizeOf(Char) = ? |
Сообщ.
#18
,
|
|
|
Хых, страшно рад, что мой вопрос вызвал такой оживленный спор... =)
Цитата Rouse_ @ TSampleRec=record Text: String; Num: Integer; end; i: integer; sr: TSampleRec; fs: TFileStream; begin sr.Text := 'test text'; sr.Num := 19; // Пишем fs := TFileStream.Create('c:\temp\file.tst', fmCreate); try i := Length(sr.Text); fs.Write(i,4); fs.Write(sr.Text[1],Length(sr.Text)); fs.Write(sr.Num,4); finally fs.Free; end; // Читаем fs := TFileStream.Create('c:\temp\file.tst', fmOpenRead); try fs.Read(i,4); SetLength(sr.Text,i); fs.Read(sr.Text[1],i); fs.Read(sr.Num,4); finally fs.Free; end; Rouse, если бы все было так просто, я бы и вопрос не задавал! ) Такая мысль мне и самому приходила. Согласен, что так рекорд успешно запишется, но если учесть, что в нем несколько десятков полей, многие из которых также являются записями, которые также содержать большое количество полей и динамических массивов... К тому же размер файла существенно возрастет, если перед каждой переменной записывать ее размер, да и скорость будет не совсем приемлимой... Я уж не говорю о том, что я просто запарюсь печетать! =\ Может есть другой способ? |
Сообщ.
#19
,
|
|
|
Ins! Rouse! Блин, ну создали бы что-ли отдельную ветку "Филосифия Delphi"! )) А у меня сейчас есть реальный вопрос и совсем не много времени! Плиз, ребята, помогите разобраться!
|
Сообщ.
#20
,
|
|
|
R@RED приведи пример твоей записи попробую помочь ...
Сообщения были разделены в тему "Фундаментальные и общие типы данных" |
Сообщ.
#21
,
|
|
|
хм нифигасе нафлудили, и кто?, люди облаченные властью и знаниями
а про то что помочь топикстартеру забыли? а проблема имхо на поверхности! R@RED type TProject =record num:word; doc:array[1..128] of char; end .. var Project:TProject; ... WriteBuffer(Project, SizeOf(Project)); сработает! а вот type TProject =record num:word; doc:Pchar; end .. var Project:TProject; ... WriteBuffer(Project, SizeOf(Project)); нет! а почему? догадался? ЗЫ примерчик офтопа как то раз пришел один ко мне на работе и говорит типа ты че лох говориш что песенки занимают примерно 1метр/минута, вот у меня на дискете 400 песен и еще место осталось. и как вы думаете что было на дискете? правильно... 400 ярлыков, у дома у него все работало не используй указательные типы (pchar это указатель на на массив символов, имеет размер sizeof(pointer), а данные находятся в другой области памяти) |
Сообщ.
#22
,
|
|
|
Цитата andrew.virus @ приведи пример твоей записи попробую помочь ... Ок, по определенным причинам не могу привести конкретно свой рекорд, но приведу подобный, если удасться сохранить его, то и проблема будет решена: type TRecType1 = (rtRTV1, rtRTV2); type TRecType2 = set of (rttRTV1, rttRTV2); type TSubRec = record str1 : string; str2 : ShortString; int1 : integer; int2 : LongInt; _type : TRecType1; _type1 : TRecType2; mass1 : array of string; mass2 : array of integer; bool1 : boolean; end; type TProject = record mass1 : array of TSubRec; str1 : string; int1 : LongInt; int2 : integer; bool1 : boolean; end; Только необходимо учитывать, что полей и типов гораздо больше, так что способ Демо не подходит. Есть идеи? =) |
Сообщ.
#23
,
|
|
|
R@REDмой пост выше читал?
sizeof(mass1) =4 !!! как думаеш почему? кстати string тоже указатель фиксированный только ShortString Добавлено в твоем примере type TRecType1 = (rtRTV1, rtRTV2); type TRecType2 = set of (rttRTV1, rttRTV2); type TSubRec = record str1 : string; str2 : ShortString; int1 : integer; int2 : LongInt; _type : TRecType1; _type1 : TRecType2; mass1 : array of string; mass2 : array of integer; bool1 : boolean; end; type TProject = record mass1 : array of TSubRec; str1 : string; int1 : LongInt; int2 : integer; bool1 : boolean; end; это ошибки |
Сообщ.
#24
,
|
|
|
Цитата Virtuals @ sizeof(mass1) =4 !!! как думаеш почему? Почему же? Цитата Virtuals @ это ошибки Что значит ошибки, если мне необходимо использование именно этих типов? Если string на какой то подобный строковой тип я еще смогу заменить, то как например я должен обходиться без динамических массивов? Извини, если чего-то не понял, буду рад, если приведешь правильный пример записи. |
Сообщ.
#25
,
|
|
|
R@RED
Универсального решения для сохранения структур в файл нет. Принцип понятен, остальное - кодирование. Т.е. каждую структуру нужно обрабатывать по-своему. |
Сообщ.
#26
,
|
|
|
Цитата Демо @ каждую структуру нужно обрабатывать по-своему. Цитата R@RED @ Согласен, что так рекорд успешно запишется, но если учесть, что в нем несколько десятков полей, многие из которых также являются записями, которые также содержать большое количество полей и динамических массивов... К тому же размер файла существенно возрастет, если перед каждой переменной записывать ее размер, да и скорость будет не совсем приемлимой... Я правильно понял, что в моем случае обрабатывать структуры по одтельности - это единственный путь и ни смотря на все минусы альтернативного решения нет? =( |
Сообщ.
#27
,
|
|
|
Цитата R@RED @ Я правильно понял, что в моем случае обрабатывать структуры по одтельности - это единственный путь и ни смотря на все минусы альтернативного решения нет? =( Именно так. А что, у тебя их так много? Если структуры - своеобразные наследники друг друга, то альтернативный вариант - создание классов наследников, которые умеют писать себя в поток. Это поможет упростить код и умегьшить его объём. |
Сообщ.
#28
,
|
|
|
Цитата Демо @ Это уже интереснее... А как можно реализовать умение "писать себя в поток", если опять же не пробегать все элементы по отдельности? создание классов наследников, которые умеют писать себя в поток. Это поможет упростить код и умегьшить его объём. |
Сообщ.
#29
,
|
|
|
Цитата R@RED @ А как можно реализовать умение "писать себя в поток", если опять же не пробегать все элементы по отдельности? Писать каждый элемент в любом случае придётся. Упрощение возможно лишь в случае наследования когда каждый наследник лишь добавляет новые поля для записи, а предок уже умеет работать с остальными полями. |
Сообщ.
#30
,
|
|
|
Оуу... Ясно! Что ж, видимо все таки придеться писать все по очереди... =\ Ладно, спасибо за ответы, буду рад если у кого то еще появятся какие то идеи.
|