![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Как "победить" лимит String в Записи ? [D6, Win95/98]
Fanny © (2005-09-05 09:25:00)Есть запись типа
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]делать ?
Anatoly Podgoretsky (2005-09-09 18:55:00) [1]Fanny (09.09.05 16:37) [32]
Это надо понимать - не порти голову с дества, когда она очень восприимчива.
Игорь Шевченко (2005-09-09 17:43:00) [2]Fanny (09.09.05 16:37) [32]
Можно не выкидывать, я же не выкинул :) Но использовать как руководство, право, не стоит.
Reindeer Moss Eater (2005-09-09 16:55:00) [3]Лучше предать её огню.
А то вдруг кто-нибудь подберет.
Fanny (2005-09-09 16:37:00) [4]Это что ж, книжку Архангельского можно выкинуть, так надо понимать [4],[8],[10],[31] ????????????????????????
Игорь Шевченко (2005-09-09 13:34:00) [5]Плохиш © (05.09.05 13:40) [12]
> Ну Архангельский же не виноват, что читатели читать не умеют.
Так писать надо разборчиво.
Dilmo (2005-09-09 13:18:00) [6]А почему бы не вопспользоваться объектами ?
Defunct (2005-09-09 03:08:00) [7]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);
Fanny (2005-09-08 22:12:00) [8]Да не, Map - тот который CreateFileMapping($FFFFFFFF,nil,PAGE_READWRITE........
пусть есть в этой записи переменная j
её лимит будет 255 (по умолчанию)
если, скажем, одна из DLL программы пишет туда данные, а основная программа их читатет, то как не дать DLL записать туда больше 255 ??? Или это побоку ? Может не стоит волноваться, обрежеться и всё ?
MegaVolt (2005-09-07 17:24:00) [9]Я так понял косяки есть при записи и чтении такой записи из файла? Так это решается :) В запись добавляешь поле Len где хранишь размер строки :) Далее в файл пишешь запись длинной SizeOf(Твоя_Структура)-SizeOf(String) и потом отдельно дописываешь в файл данные Write(M.j[1],M.Len); читать строго наоборот :)
PVOzerski (2005-09-07 11:22:00) [10]О "косяках" и прочих радостях :) :
1) не забываем, что в таких структурах, как короткая строка помимо видимых впоследствии юзеру символов имеется еще байт №0, содержащий длину строки (отсюда и ограничение в 255 знаков). В record этот байт попадает тоже. 2) Соответственно, в record от строки попадает не только кусок с значащими символами, но и остальной кусок строки, забитый мусором (общая длина блока составит 1 байт + лимит строки могласно описанию типа (по умолчанию + 255). Зато всё просто с позиционированием при работе с файлом - сдвиг всегда на одну величину, независимо от "рабочей" (length) длины строковых полей. 3) Невозбранно придумать собственные строкообразные конструкции (например, packed record len: word; body: array[1..1023] of char; end;) и пользоваться ими вкупе со средствами работы с PChar'ами и памятью. 4) Опять же, можно объявить такой тип фиктивно, использовать его для описания типа-указателя и писать/читать не резервируемую, а фактическую длину строки. Естественно, строковое поле при этом должно быть последним в записи, а рамка сдвига контролироваться вручную - т.е., например, типизированный файл уже не годится.
Digitman (2005-09-07 10:40:00) [11]
> MapFile
ты вообще о каком MapFile речь ведешь ? о *.map-файле, создаваемом линкером ? или о каком ?
Fanny (2005-09-07 10:34:00) [12]В принципе, может получиться и с 255.
Но тогда такой вопрос.
Есть MapFile с этой записью. Если какая-нибудь сволочь (может не специально) попробует записать сверхлимита 255, косяка не будет ?
begin...end (2005-09-06 16:06:00) [13]> BFG9k © (06.09.05 15:51) [22]
> Обьясните мне кто-нибудь, зачем использовать packed record ?
Например, чтобы не сохранять в файл лишнего. Или чтобы не зависеть при сохранении и последующей загрузке записи от указанных директив выравнивания.
BFG9k (2005-09-06 15:51:00) [14]Файл записей имеет смысл только в том случае, когда записи одинакового размера. Если хочется писать в файл строки любой длины, нужно использовать разделители. Проще всего поместить их в TStrings, далее SaveToFile и LoadFromFile.
P.S.: Обьясните мне кто-нибудь, зачем использовать packed record ?
alex_*** (2005-09-06 09:39:00) [15]упаси меня бог от строк в 2Г... если это еще и в Memo вывести...
Fanny (2005-09-06 08:02:00) [16]я так понимаю с array of charбудут косяки :)
Lamer@fools.ua (2005-09-05 17:28:00) [17]>> Alexander Panov © (05.09.05 13:32) [11]
> Давно использую записи с типом String. ПРоблем или каких-то ограничений ни разу не встречал.
Это у Вас строки маленькие. Вот если бы они где-то к двум гигабайтам подобрались...
:o)
Гаврила (2005-09-05 17:11:00) [18]
> [17] begin...end ©
Иногда лучше повторить :-)
begin...end (2005-09-05 16:37:00) [19]> Гаврила © (05.09.05 16:32) [16]
См. [3] :-)
Гаврила (2005-09-05 16:32:00) [20]Если тебе совсем уперлось сделать таки типизированный файл со строками длинной 1000 - вместо строки в записи поставь array[0..1000] of char