Версия для печати темы

Нажмите сюда для просмотра этой темы в обычном формате

Форум «Всё о Паскале» _ Теоретические вопросы _ Поддержка "длинных строчек"

Автор: Atos 21.05.2004 9:14

В описаниях более-менее новых компиляторов часто особо подчёркивается возможность работы с длинными строчками, >255. Я как-то с этим ещё не сталкивался, и любопытно: это действительно так важно?

То есть: когда возникает конкретная необходимость их использования (пример)? И есть ли такие задачи, в которых эту проблему нельзя как-нибудь хитро обойти, быстро написав собственную процедурку?

Автор: rus 21.05.2004 13:14

Если я правильно понял - то имеются в виду - Ascii-Z строки которые имеют признак конца строки - нулевой байт. Мне кажется их использование как минимум экономит память - в реализации Паскаль например - обычный String занимает всегда 256 байт - а PString - размещается в динамической памяти под кот. выделяется минимум сколько нужно.

С другой стороны лично мне помогало использовать длинные строки если например требуется создать длинные списки неизвестной заранее длинны - если в ASCIIZ строке размещать элементы и разделять их заранее оговоренным признаком - то можно создать список какой угодно длинны - пока хватит динамической памяти. Это полезно хотя бы при создании списка файлов - кот. в современных папках может быть и 1000 и 2000 а вообще я встречал 12000 мелких файлов - вот и попробуй создать массив такой размерности! И не говоря уже про различные редакторы документов (проблема > 64Кб) - а где сейчас взять такие мальнькие файлы если их размеры измеряются в Мегаб.
В Win32Api - длинные строки повсюду - хотя работать с ними удовольствие сомнительное - они всегда могут быть причиной неочивидной ошибки! Так что наверное везде где можно без них - лучше так и делать!

Автор: Altair 25.05.2004 18:38

Цитата
Так что наверное везде где можно без них - лучше так и делать!

Совершенно не согласен.
Они (ASCII-Z строки) намного удобнее чем простые.

Главное, что можно ограничить строку любой длинны, используя терминальный ноль.
Я применял длинные строки в базах данных, это очень экономит память.
Пример:
name:string[10];
А вдруг имя будет 11 символов ?
А если оно 3 символа (Аня, Оля ...) то мы теряем 8(! не 7) байт памяти.

Автор: BlackShadow 25.05.2004 19:12

Можно по-подробнеее про

Цитата
мы теряем 8(! не 7)
. Что-то я не догнал <_<

Автор: virt 25.05.2004 19:17

BlackShadow
11-3=8 ,может поэтому?

Автор: Altair 25.05.2004 19:32

Цитата
11-3=8 ,может поэтому?

Нет, не по этому!
Итак, string[10]
сколько занимает места?
10 байт? Дудки :P
11 байт!!!!!!!!!!!!!!!
Вот как в памяти будет:
| | | | | | | | | | | |
В первом участке строки будет длинна!
(а вы думали, как можно узнать длинну стоки?)
длинна = ORD(s[0]);

Автор: BlackShadow 25.05.2004 19:34

Ты не забыл про завершающий 0 в ASCII-Z?

Автор: Altair 26.05.2004 10:42

Цитата
Ты не забыл про завершающий 0 в ASCII-Z?

Будь он не ладен, конечно забыл, тьфу на него 3 раза!
Ну тогда разница 7 байт, приношу извинение за путаницу!
Все-равно всем понятно, что длинные строки выгоднее использовать!

Автор: trminator 27.05.2004 22:35

В Дельфи, например, длинные строки реализованы как в старом Паскале -- только под счетчик длины отведено 4 байта.

А насчет фиксированного размера и расхода памяти... не уверен. Возьмем тот же Дельфи. Длина строки ограничена 2 Гб. Но это же не значит, что под нее выделится два гига =) Выделится ровно столько, сколько нужно. Хотя если ты имел ввиду жесткий диск, то оно так.

Зато заранее известная длина строки -- очень удобно smile.gif (когда ее нужно знать, разумеется). А так только чтобы посчитать длину строки нужно время.

Автор: Altair 27.05.2004 22:45

Цитата
А насчет фиксированного размера и расхода памяти... не уверен

Я верю книгам...
Хотя можно попробовать DEBUG'ом .. Чем я и займусь ...

Автор: BlackShadow 28.05.2004 1:39

trminator, произошда типичная подмена понятий: ты не путай тёплое с мягким smile.gif Pascal это не Delphi. Хоть и похожи smile.gif

Автор: Altair 28.05.2004 1:47

Нет, я проверил. Т.е согласен с BlackShadow. При стринге в 256 бат все они резервируются!

Автор: trminator 28.05.2004 2:37

Oleg_Z, код в студию! Не верю, что под string в ОП резервируются 256 байт. Хотя допускаю, что sizeof(s) будет выдавать 256... xz
BlackShadow, да, погорячился, пожалуй... в Паскале альтернтивы ASCIIZ хотя бы в плане длины нет

Автор: Altair 28.05.2004 12:21

Значит так.

Цитата
var
s1:string;
s2:string[8];
s3:string;

begin
s1:='123456789012345678901234567890';
s1[0]:=chr(5);
s2:=s1;
s3:=s1;
s3[0]:=chr(200);
end.

Все надо трассировать (F7) и открыто окно Watch, в котором просматриваем все строки.
После выполнения последней команды, обратите внимание, что строка дополнилась нулями. Это могло быть, только если под эту переменную выделилось 256 байт. Иначе там были бы случайные символы. Ведб там не известно какая переменная, и строка начала бы читать эту переменную!

Автор: BlackShadow 28.05.2004 14:01

Не факт. Скорее всего при компиляции паскаль выравнивает область данных по какой-то границе (например 4К)., а в режиме DEBUG естественно забивает её нулями. Но ты прав - длина фиксирована.

Автор: Altair 28.05.2004 14:54

Хм, я об этом не подумал. Но почему тогда во всех книгах пишется, что под стринг выделяется 256 байт? Ложь?

Автор: BlackShadow 28.05.2004 15:21

Oleg_Z, ты меня добить хочешь.
Во-первых НЕ ЛОЖЬ, а ИСТИНА. Я же тебе говорю, что длина действительно фиксирована!
Во-вторых. Как измерить объём памяти отведённый под НЕЧТО? Ставим какую-нибудь метку перед НЕЧТО и сразу после НЕЧТО. Затем берём разность адресов второй и первой метки и получаем этот самый размер. В случае с переменными меткой 1 является она сама, а меткой 2 может послужить переменная, объявленная непосредственно за ней. Что может быть банальней?

Автор: Altair 28.05.2004 21:38

Ну, да, да, все верно. Добивать не буду :D