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

Вниз

Как "победить" лимит String в Записи ?   Найти похожие ветки 

 
Fanny   (2005-09-05 09:25) [0]

Есть запись типа


PMyData = ^TMyData;
TMyData = packed record
 i : boolean;
 j : string;
 end;


и переменная (глобальная) этого типа


var
 M : TMyData;


работаю с map-файлами, а там танцы с бубном (указатели и пр.)
вобщем M.i работает, а M.j не хочет.
у Архангельского записано, что в Записях String надо лимитировать, те правильно так:


PMyData = ^TMyData;
TMyData = packed record
 i : boolean;
 j : string[50];
 end;


вот это самое [50] всё дело и стопорит, больше 255 нельзя - начинает ругаться компилятор, а мне надо ну хотя бы 1000

и еще - если j это массив array of string, то что, надо тоже array of string[50] делать ?


 
Fanny   (2005-09-05 09:27) [1]

да, соовсем забыл,

если делать


PMyData = ^TMyData;
TMyData = packed record
i : boolean;
j : string[50]<\b>;
end;
<\code>

то всё работает<\b>, но огорчает лимит :(


 
Digitman ©   (2005-09-05 09:28) [2]


> работаю с map-файлами, а там танцы с бубном (указатели и
> пр.)


это же не повод сразу же рассуждать о каких-то "лимитах" ..

как ты намерен использовать эту структуру ?

поясни ..


 
begin...end ©   (2005-09-05 09:29) [3]

> Fanny   (05.09.05 09:25)
> а мне надо ну хотя бы 1000

Либо отказаться от чтения записи "целиком" (и читать каждое поле с учётом его специфики), либо, если строка более-менее фиксированной длины, заменить string на статический array of Char нужного размера.


 
Reindeer Moss Eater ©   (2005-09-05 09:32) [4]

>у Архангельского записано, что в Записях String надо лимитировать,

бред какой.


 
Reindeer Moss Eater ©   (2005-09-05 09:33) [5]

Длинные анси строки нельзя использовать в вариантной части записей и только-то.


 
Fanny   (2005-09-05 09:50) [6]

2Reindeer Moss Eater
а если надо, то что использовать ?

лимит вообще не нужен


 
Reindeer Moss Eater ©   (2005-09-05 10:17) [7]

Нужны длинные строки - используй длинные строки.
Только сериализацию рекорда в файл пиши с умом, а не по Архангельскому.
Длинная сторка - это указатель, а не сами данные.


 
Гаврила ©   (2005-09-05 10:34) [8]


> >у Архангельского записано, что в Записях String надо лимитировать,
>


Ты уверен что именнт так там и написано?
Если да - то прав ИШ, архангельский-ламер


 
Erik1 ©   (2005-09-05 11:10) [9]

Тоесть сначала длину строки а после саму строку и длина должна быть фиксированого размера.


 
Anatoly Podgoretsky ©   (2005-09-05 13:05) [10]

Fanny   (05.09.05 09:25)  
у Архангельского записано,

Попрошу не ругаться.


 
Alexander Panov ©   (2005-09-05 13:32) [11]

Давно использую записи с типом String. ПРоблем или каких-то ограничений ни разу не встречал.


 
Плохиш ©   (2005-09-05 13:40) [12]

Ну Архангельский же не виноват, что читатели читать не умеют.

При описании работы с типизированными файлами, это правильно. О чём Борланд и пишет в документации и справке.


 
TUser ©   (2005-09-05 15:09) [13]

> что в Записях String надо лимитировать

Надо, если ты используешь отображаемые в память файлы. А я так понимаю, именно это ты и делаешь.


 
Fanny   (2005-09-05 16:18) [14]

чёрт с ним, с лимитом !
но почему всего 255 ?


 
begin...end ©   (2005-09-05 16:30) [15]

> Fanny   (05.09.05 16:18) [14]

Это ограничение для типа ShortString. Строка этого типа из N символов занимает в памяти N + 1 байт -- первый байт используется для хранения длины строки. В один байт не может поместиться число больше 255 -- отсюда и ограничение. А длинные строки (AnsiString) нельзя использовать в составе записей типизированного файла, поскольку они требуют финализации.


 
Гаврила ©   (2005-09-05 16:32) [16]

Если тебе совсем уперлось сделать таки типизированный файл со строками длинной 1000 - вместо строки в записи поставь array[0..1000] of char


 
begin...end ©   (2005-09-05 16:37) [17]

> Гаврила ©   (05.09.05 16:32) [16]

См. [3] :-)


 
Гаврила ©   (2005-09-05 17:11) [18]


>  [17] begin...end ©  

Иногда лучше повторить :-)


 
Lamer@fools.ua ©   (2005-09-05 17:28) [19]

>>Alexander Panov ©   (05.09.05 13:32) [11]

>Давно использую записи с типом String. ПРоблем или каких-то ограничений ни разу не встречал.

Это у Вас строки маленькие. Вот если бы они где-то к двум гигабайтам подобрались...
:o)


 
Fanny   (2005-09-06 08:02) [20]

я так понимаю с array of char будут косяки :)


 
alex_***   (2005-09-06 09:39) [21]

упаси меня бог от строк в 2Г...  если это еще и в Memo вывести...


 
BFG9k ©   (2005-09-06 15:51) [22]

Файл записей имеет смысл только в том случае, когда записи одинакового размера. Если хочется писать в файл строки любой длины, нужно использовать разделители. Проще всего поместить их в TStrings, далее SaveToFile и LoadFromFile.

P.S.: Обьясните мне кто-нибудь, зачем использовать packed record ?


 
begin...end ©   (2005-09-06 16:06) [23]

> BFG9k ©   (06.09.05 15:51) [22]

> Обьясните мне кто-нибудь, зачем использовать packed record ?

Например, чтобы не сохранять в файл лишнего. Или чтобы не зависеть при сохранении и последующей загрузке записи от указанных директив выравнивания.


 
Fanny   (2005-09-07 10:34) [24]

В принципе, может получиться и с 255.

Но тогда такой вопрос.
Есть MapFile с этой записью. Если какая-нибудь сволочь (может не специально) попробует записать сверхлимита 255, косяка не будет ?


 
Digitman ©   (2005-09-07 10:40) [25]


> MapFile


ты вообще о каком MapFile речь ведешь ? о *.map-файле, создаваемом линкером ? или о каком ?


 
PVOzerski ©   (2005-09-07 11:22) [26]

О "косяках" и прочих радостях :) :
1) не забываем, что в таких структурах, как короткая строка помимо видимых впоследствии юзеру символов имеется еще байт №0, содержащий длину строки (отсюда и ограничение в 255 знаков). В record этот байт попадает тоже. 2) Соответственно, в record от строки попадает не только кусок с значащими символами, но и остальной кусок строки, забитый мусором (общая длина блока составит 1 байт + лимит строки могласно описанию типа (по умолчанию + 255). Зато всё просто с позиционированием при работе с файлом - сдвиг всегда на одну величину, независимо от "рабочей" (length) длины строковых полей. 3) Невозбранно придумать собственные строкообразные конструкции (например, packed record len: word; body: array[1..1023] of char; end;) и пользоваться ими вкупе со средствами работы с PChar"ами и памятью. 4) Опять же, можно объявить такой тип фиктивно, использовать его для описания типа-указателя и писать/читать не резервируемую, а фактическую длину строки. Естественно, строковое поле при этом должно быть последним в записи, а рамка сдвига контролироваться вручную - т.е., например, типизированный файл уже не годится.


 
MegaVolt ©   (2005-09-07 17:24) [27]

Я так понял косяки есть при записи и чтении такой записи из файла? Так это решается :) В запись добавляешь поле Len где хранишь размер строки :) Далее в файл пишешь запись длинной SizeOf(Твоя_Структура)-SizeOf(String) и потом отдельно дописываешь в файл данные Write(M.j[1],M.Len); читать строго наоборот :)


 
Fanny   (2005-09-08 22:12) [28]

Да не, Map - тот который CreateFileMapping($FFFFFFFF,nil,PAGE_READWRITE........

пусть есть в этой записи переменная j
её лимит будет 255 (по умолчанию)

если, скажем, одна из DLL программы пишет туда данные, а основная программа их читатет, то как не дать DLL записать туда больше 255 ???  Или это побоку ?  Может не стоит волноваться, обрежеться и всё ?


 
Defunct ©   (2005-09-09 03:08) [29]

Fanny   (08.09.05 22:12) [28]

Пофигу какой файл, и как он создан.
сохраняй строку в файл самостоятельно.

i : integer;
Str : String;

i := Length( Str );
FileStream.Write( i, 4);
FileStream.Write( Str[1], i);

и восстанавливай из файла также.

i : integer;
Str : String;

FileStream.Read( i, 4);
SetLength( Str, i);
FileStream.Read( Str[1], i);


 
Dilmo   (2005-09-09 13:18) [30]

А почему бы не вопспользоваться объектами ?


 
Игорь Шевченко ©   (2005-09-09 13:34) [31]

Плохиш ©   (05.09.05 13:40) [12]


> Ну Архангельский же не виноват, что читатели читать не умеют.


Так писать надо разборчиво.


 
Fanny   (2005-09-09 16:37) [32]

Это что ж, книжку Архангельского можно выкинуть, так надо понимать [4],[8],[10],[31] ????????????????????????


 
Reindeer Moss Eater ©   (2005-09-09 16:55) [33]

Лучше предать её огню.
А то вдруг кто-нибудь подберет.


 
Игорь Шевченко ©   (2005-09-09 17:43) [34]

Fanny   (09.09.05 16:37) [32]

Можно не выкидывать, я же не выкинул :) Но использовать как руководство, право, не стоит.


 
Anatoly Podgoretsky ©   (2005-09-09 18:55) [35]

Fanny   (09.09.05 16:37) [32]
Это надо понимать - не порти голову с дества, когда она очень восприимчива.



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

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

Наверх




Память: 0.55 MB
Время: 0.052 c
1-1126248874
Windows
2005-09-09 10:54
2005.10.02
Работа с сервисами


1-1126012628
July
2005-09-06 17:17
2005.10.02
копирование объектов runtime


4-1123249044
Anton S.
2005-08-05 17:37
2005.10.02
Форма "всегда внизу"


1-1126019229
Relaxxx
2005-09-06 19:07
2005.10.02
2 вопроса:разделитель дробной части и popupMenu не закрывать по


1-1125988262
Lexandr
2005-09-06 10:31
2005.10.02
Zlib - архивирование