Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

Тип данных String


ssnakess ©   (2011-03-11 12:02:00) 

Доброго времени суток!
Тип String до 256 символов представляет собой массив где элемент с индексом 0 хранит в себе длину строки.  Дельфи позволяет объявить переменную типа String и записать в неё строку более чем 255 символов. Подскажите, что из себя будет представлять переменная в этом случае?
Может быть PChar?


ssnakess   (2011-03-11 13:24:00) [1]

> All
спасибо :)

PS
как обычно, пока не задашь вопрос на форуме, ничего не на гуглишь на искомую тему :) как только спросишь, сразу же находишь отличную статью :)
вот например.
http://www.sources.ru/magazine/0804/delphistr.html


OW   (2011-03-11 12:50:00) [2]

если только ветка  долго в топе провисит :)


Юрий Зотов   (2011-03-11 12:28:00) [3]

> ssnakess ©   (11.03.11 12:02)  

> Тип String до 256 символов представляет собой массив где элемент с
> индексом 0 хранит в себе длину строки.


Это тип ShortString. А тип String - это либо ShortString, либо AnsiString, в зависимости от настроек компилятора. В старых версиях Delphi по умолчанию тип String - это AnsiString.

> Дельфи позволяет объявить переменную типа String и записать в неё
> строку более чем 255 символов.


Это тип AnsiString (в старых версиях Delphi).

> что из себя будет представлять переменная в этом случае?
> Может быть PChar?


Не совсем. Переменная типа AnsiString - это, как и PChar, действительно указатель на тело строки, заканчивающееся символом #0 (и поэтому тип AnsiString совместим с PChar, что позволяет использовать простое приведение типа, когда это нужно).

Но если PChar - это только указатель на тело строки, то AnsiString - это одновременно еще и указатель на структуру, в которой (по отрицательным смещениям) хранятся еще длина строки и счетчик ссылок на нее.

Кроме того, тип AnsiString - это тип с управляемым временем жизни (в отличие от PChar). Компилятор генерит код, автоматически управляющий значением счетчика ссылок и если тот становится равным нулю, то строка уничтожается.

PS
> All
Могу спорить, что сейчас сюда придет Великий Непотопляемый Гуру и расскажет мне про WideString и Юникод.
:o)


Anatoly Podgoretsky   (2011-03-11 12:26:00) [4]


> но если строка более 255 символов, то элемент с индексом
> 0 не будет длиной строки? Как тогда хранится строка?

Устройство строк хорошо описано в справке.


Anatoly Podgoretsky   (2011-03-11 12:25:00) [5]


> String и записать в неё строку более чем 255 символов.

Может и меньше и элемента с индексом 0 совсем нет. Если только явно не указать длину.


Сергей М.   (2011-03-11 12:21:00) [6]


> если строка более 255 символов


С чего она будет больше ? Ты же ведешь речь именно о ShortString, насколько я понял ..


> Как тогда хранится строка?


Любая строковая переменная с неуказанной явно длиной в адр.пространстве процесса представлена указателем.


ssnakess   (2011-03-11 12:19:00) [7]


> clickmaker ©   (11.03.11 12:16) [3]

спасибо :)


clickmaker   (2011-03-11 12:16:00) [8]

> Как тогда хранится строка?

по смещению -4 - длина строки. Сама строка лежит, начиная с 0-го байта, как обычный массив


ssnakess   (2011-03-11 12:13:00) [9]


> Указатель это (в дан.случае на элемент с индексом 0).


но если строка более 255 символов, то элемент с индексом 0 не будет длиной строки? Как тогда хранится строка?


Сергей М.   (2011-03-11 12:07:00) [10]

Указатель это (в дан.случае на элемент с индексом 0).


Наверх

Титульная страница Поиск, карта сайта Написать письмо