Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Основная";
Текущий архив: 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
1-1126172596
AddValue
2005-09-08 13:43
2005.10.02
Delphi vs Assembler


1-1126671066
Denizzz
2005-09-14 08:11
2005.10.02
Как получить серийный номер жесткого диска?


1-1125930773
kblc
2005-09-05 18:32
2005.10.02
Singleton Com Server


1-1126100482
avsam
2005-09-07 17:41
2005.10.02
тип файла (bmp или jpeg)?


1-1126115085
megabax
2005-09-07 21:44
2005.10.02
Проблемы с присваиванием типа TextFile





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский