Помощь - Поиск - Пользователи - Календарь
Полная версия: Поддержка "длинных строчек"
Форум «Всё о Паскале» > Pascal, Object Pascal > Теоретические вопросы
Atos
В описаниях более-менее новых компиляторов часто особо подчёркивается возможность работы с длинными строчками, >255. Я как-то с этим ещё не сталкивался, и любопытно: это действительно так важно?

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

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

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

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

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

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

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

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

Я верю книгам...
Хотя можно попробовать DEBUG'ом .. Чем я и займусь ...
BlackShadow
trminator, произошда типичная подмена понятий: ты не путай тёплое с мягким smile.gif Pascal это не Delphi. Хоть и похожи smile.gif
Altair
Нет, я проверил. Т.е согласен с BlackShadow. При стринге в 256 бат все они резервируются!
trminator
Oleg_Z, код в студию! Не верю, что под string в ОП резервируются 256 байт. Хотя допускаю, что sizeof(s) будет выдавать 256... xz
BlackShadow, да, погорячился, пожалуй... в Паскале альтернтивы ASCIIZ хотя бы в плане длины нет
Altair
Значит так.
Цитата
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
Не факт. Скорее всего при компиляции паскаль выравнивает область данных по какой-то границе (например 4К)., а в режиме DEBUG естественно забивает её нулями. Но ты прав - длина фиксирована.
Altair
Хм, я об этом не подумал. Но почему тогда во всех книгах пишется, что под стринг выделяется 256 байт? Ложь?
BlackShadow
Oleg_Z, ты меня добить хочешь.
Во-первых НЕ ЛОЖЬ, а ИСТИНА. Я же тебе говорю, что длина действительно фиксирована!
Во-вторых. Как измерить объём памяти отведённый под НЕЧТО? Ставим какую-нибудь метку перед НЕЧТО и сразу после НЕЧТО. Затем берём разность адресов второй и первой метки и получаем этот самый размер. В случае с переменными меткой 1 является она сама, а меткой 2 может послужить переменная, объявленная непосредственно за ней. Что может быть банальней?
Altair
Ну, да, да, все верно. Добивать не буду :D
Это текстовая версия — только основной контент. Для просмотра полной версии этой страницы, пожалуйста, нажмите сюда.