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