![]() |
|
|
Регистрация Восстановить пароль |
Регистрация | Задать вопрос |
Заплачу за решение |
Новые сообщения |
Сообщения за день |
Расширенный поиск |
Правила |
Всё прочитано |
![]() |
|
|
Опции темы | Поиск в этой теме |
![]() |
#1 |
Форумчанин
Регистрация: 10.02.2021
Сообщений: 684
|
![]()
В Паскале длина строки была 255 символов, а нулевой символ был равен ее длине
В Дельфи строки неограниченной длины, как я понял. Что вызывает вопрос: а как под строку выделяется память? Когда неизвестно сколько надо выделять из-за неограниченности длины |
![]() |
![]() |
![]() |
#2 |
Форумчанин
Регистрация: 10.02.2021
Сообщений: 684
|
![]()
Эти вопросы имеют отношение к обращению к строке через asm
(Адрес строки + номер элемента - 1) всегда ли будет верным адресом символа? |
![]() |
![]() |
![]() |
#3 | |
Участник клуба
Регистрация: 17.04.2022
Сообщений: 1,833
|
![]() Цитата:
Строение типа String на Delphi может быть разным от версии к версии. Например в Lazarus тип String напрямую описывается как класс. В Delphi 7 версии однако подобного описания типа String я не находил (хотя, возможно, и там такое было). Поэтому работать напрямую с типом String не стоит. Не говоря уже про сборщик мусора, который следит за высвобождением памяти от динамических объектов/классов. Если хотите работать со строками, тогда лучше используйте тип PChar/PAnsiChar/PWideChar. В этом случае строки представляются как массив символов начинающихся с 0 индекса и оканчиваются символом с кодом #0. Эти типы как раз предусмотрены для взаимодействия с внешними программами и максимально упрощают структуры связанные с ЯП Pascal в них. Для строк типа PChar этот адрес будет (Адрес строки + номер элемента) |
|
![]() |
![]() |
![]() |
#4 |
Форумчанин
Регистрация: 10.02.2021
Сообщений: 684
|
![]()
А если мне нужна строка паскалевского типа, надо объявлять ее string[255] ?
|
![]() |
![]() |
![]() |
#5 |
Участник клуба
Регистрация: 17.04.2022
Сообщений: 1,833
|
![]() |
![]() |
![]() |
![]() |
#6 |
Форумчанин
Регистрация: 10.02.2021
Сообщений: 684
|
![]()
Чтобы не создавать новую тему, пишу вопрос тут.
А как выделяется память под строку? Учитывая ее неограниченность. Если я через SetLength увеличу длину, то не затрет ли тогда строка какие-то другие данные? Или у "неограниченной" строки тоже есть лимит и под него уже выделена полностью память? |
![]() |
![]() |
![]() |
#7 |
ПШП
Участник клуба
Регистрация: 15.07.2013
Сообщений: 1,926
|
![]() |
![]() |
![]() |
![]() |
#8 |
Форумчанин
Регистрация: 10.02.2021
Сообщений: 684
|
![]()
Получается, тогда может измениться адрес, где находится эта строка? И где тогда искать новый адрес? Если через asm
|
![]() |
![]() |
![]() |
#9 |
Форумчанин
Регистрация: 10.02.2021
Сообщений: 684
|
![]()
Такой код выдаёт ошибку при исполнении
Код:
|
![]() |
![]() |
![]() |
#10 |
Участник клуба
Регистрация: 17.04.2022
Сообщений: 1,833
|
![]()
Не стоит играться с этими объектами на asm. Они завязаны на более сложные алгоритмы и на asm вы вручную чокнитесь постоянно выполнять все необходимые манипуляции со строками.
Память на 1 этапе резервируется на уровне страниц в виртуальном адресном пространстве в виде кучи. Далее по мере использования из этой кучи будут выделяться блоки нужной длины, но все же длина кучи ограничена (как минимум виртуальным адресным пространством), но как правило не более чем 16 - 64 Мб. Если надо больше, тогда проще выделить сразу виртуальную память. Куча все же предназначена для объектов типа строк, массивов или структур, которые условно не ограничены. Естественно менеджер кучи при выделении блоков следит, чтобы они не пересекались, поэтому, если вы не вылезете за пределы выделенного вам участка, тогда и не затрете ничего. При каждой операции со строками компилятор сначала считает длину результирующей строки и, при необходимости, выделяет для нее новый блок памяти. Затем все соединяется в этом буфере. В целом это очень муторные операции, но они еще снабжены счетчиками ссылок, и другими атрибутами. В целом - используйте String в коде на Delphi и компилятор обо всем позаботится. На asm туда лучше не лезть еще и из-за того, что описания этого внутреннего объекта может отличаться на разных версиях компилятора, поэтому ваш asm код станет нерабочим. Потому, что cтроку типа String надо сначала выделить. Изначально у вас нету вообще блока памяти и указатель, скорее всего, равен nil. Последний раз редактировалось macomics; 08.09.2022 в 00:53. |
![]() |
![]() |
![]() |
|
![]() |
||||
Тема | Автор | Раздел | Ответов | Последнее сообщение |
Несколько вопросов по ИС | Niddin_hp | Помощь студентам | 0 | 22.11.2015 21:06 |
Несколько вопросов | Rost93 | PHP | 18 | 19.09.2012 19:38 |
Несколько вопросов по C++ | Antitime | Общие вопросы C/C++ | 10 | 26.01.2012 15:00 |
несколько вопросов | spydark91 | Общие вопросы Delphi | 2 | 18.07.2011 13:48 |
несколько вопросов | fitc | Общие вопросы Delphi | 28 | 14.07.2009 21:20 |