Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

Как "победить" лимит String в Записи ? [D6, Win95/98]


Страницы:   1 2

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


Страницы:   1 2

Наверх

Титульная страница Поиск, карта сайта Написать письмо