IPB
ЛогинПароль:

> Правила раздела!

1. Заголовок или название темы должно быть информативным !
2. Все тексты фрагментов программ должны помещаться в теги [code] ... [/code] или [code=pas] ... [/code].
3. Прежде чем задавать вопрос, см. "FAQ" и используйте ПОИСК !
4. НЕ используйте форум для личного общения!
5. Самое главное - это раздел теоретический, т.е. никаких задач и программ (за исключением небольших фрагментов) - для этого есть отдельный раздел!

 
 Ответить  Открыть новую тему 
> Поддержка "длинных строчек"
сообщение
Сообщение #1


Прогрессор
****

Группа: Пользователи
Сообщений: 602
Пол: Мужской
Реальное имя: Михаил

Репутация: -  9  +


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

То есть: когда возникает конкретная необходимость их использования (пример)? И есть ли такие задачи, в которых эту проблему нельзя как-нибудь хитро обойти, быстро написав собственную процедурку?
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #2





Группа: Пользователи
Сообщений: 9

Репутация: -  0  +


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

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


Ищущий истину
******

Группа: Пользователи
Сообщений: 4 825
Пол: Мужской
Реальное имя: Олег

Репутация: -  45  +


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

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

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


--------------------
Помогая друг другу, мы справимся с любыми трудностями!
"Не опускать крылья!" (С)
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #4


Гость






Можно по-подробнеее про
Цитата
мы теряем 8(! не 7)
. Что-то я не догнал <_<
 К началу страницы 
+ Ответить 
сообщение
Сообщение #5


Знаток
****

Группа: Пользователи
Сообщений: 419
Пол: Мужской

Репутация: -  6  +


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


--------------------
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #6


Ищущий истину
******

Группа: Пользователи
Сообщений: 4 825
Пол: Мужской
Реальное имя: Олег

Репутация: -  45  +


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

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


--------------------
Помогая друг другу, мы справимся с любыми трудностями!
"Не опускать крылья!" (С)
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #7


Гость






Ты не забыл про завершающий 0 в ASCII-Z?
 К началу страницы 
+ Ответить 
сообщение
Сообщение #8


Ищущий истину
******

Группа: Пользователи
Сообщений: 4 825
Пол: Мужской
Реальное имя: Олег

Репутация: -  45  +


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

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


--------------------
Помогая друг другу, мы справимся с любыми трудностями!
"Не опускать крылья!" (С)
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #9


Четыре квадратика
****

Группа: Пользователи
Сообщений: 579
Пол: Мужской

Репутация: -  4  +


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

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

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


--------------------
Закон добровольного труда Зимерги:
Люди всегда согласны сделать работу, когда необходимость в этом уже отпала
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #10


Ищущий истину
******

Группа: Пользователи
Сообщений: 4 825
Пол: Мужской
Реальное имя: Олег

Репутация: -  45  +


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

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


--------------------
Помогая друг другу, мы справимся с любыми трудностями!
"Не опускать крылья!" (С)
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #11


Гость






trminator, произошда типичная подмена понятий: ты не путай тёплое с мягким smile.gif Pascal это не Delphi. Хоть и похожи smile.gif
 К началу страницы 
+ Ответить 
сообщение
Сообщение #12


Ищущий истину
******

Группа: Пользователи
Сообщений: 4 825
Пол: Мужской
Реальное имя: Олег

Репутация: -  45  +


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


--------------------
Помогая друг другу, мы справимся с любыми трудностями!
"Не опускать крылья!" (С)
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #13


Четыре квадратика
****

Группа: Пользователи
Сообщений: 579
Пол: Мужской

Репутация: -  4  +


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


--------------------
Закон добровольного труда Зимерги:
Люди всегда согласны сделать работу, когда необходимость в этом уже отпала
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #14


Ищущий истину
******

Группа: Пользователи
Сообщений: 4 825
Пол: Мужской
Реальное имя: Олег

Репутация: -  45  +


Значит так.
Цитата
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 байт. Иначе там были бы случайные символы. Ведб там не известно какая переменная, и строка начала бы читать эту переменную!


--------------------
Помогая друг другу, мы справимся с любыми трудностями!
"Не опускать крылья!" (С)
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #15


Гость






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


Ищущий истину
******

Группа: Пользователи
Сообщений: 4 825
Пол: Мужской
Реальное имя: Олег

Репутация: -  45  +


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


--------------------
Помогая друг другу, мы справимся с любыми трудностями!
"Не опускать крылья!" (С)
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #17


Гость






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


Ищущий истину
******

Группа: Пользователи
Сообщений: 4 825
Пол: Мужской
Реальное имя: Олег

Репутация: -  45  +


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


--------------------
Помогая друг другу, мы справимся с любыми трудностями!
"Не опускать крылья!" (С)
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 

 Ответить  Открыть новую тему 
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 





- Текстовая версия 1.12.2020 19:46
500Gb HDD, 6Gb RAM, 2 Cores, 7 EUR в месяц — такие хостинги правда бывают
Связь с администрацией: bu_gen в домене octagram.name