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

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

AnsiString [D4]


Страницы:   1 2

ninja ©   (2004-10-02 12:19:00) 

привет. я в книжке прочитал, что структура AnsiString состоит из дескриптора (8 байт, первые 4 - длина, вторые 4 - число ссылок на строку, затем - сама строка). У простой строки дескриптор из 1 байта = длина строки. Так вот, при копировании CopyMem, например, в массив из byte, адрес для shortstring нужно указывать начиная с первого символа, т.е. @str1[1], а для ansi работает такая фигня: Pointer(str2). Куда же девался этот дескриптор??


Piter   (2004-10-03 17:14:00) [1]

я говорю об одном, а вы мне о другом. Ладно, забьем :)

P.S. Я знаю строение строк. Даже где-то типа заметки  по этому поводу писал...


GuAV   (2004-10-03 14:25:00) [2]


> ты имеешь в виду SetLenght? А толку? Что изменится для shortstring?

Нулевой символ в котором записана длина.

> Как же тогда понимать заявления

Во первых, действительно проще. Во вторых не потому, а потому что об'ём памяти занимаемый переменной какого либо типа изменить невозможно (переменные типа дин массивы и длиные строки занимают четыре байта).


Piter   (2004-10-03 14:11:00) [3]

Семен Сорокин ©   (03.10.04 13:33) [16]
разговор был в контексте именно ShortString


ну так string[n] если n<=255 то это shortstring


Piter   (2004-10-03 14:10:00) [4]

jack128 ©   (03.10.04 13:16) [13]
длину СТРОКИ можно менять


ты имеешь в виду SetLenght? А толку? Что изменится для shortstring?

Отсюда следует, что максимальная длина строки, хранящейся в переменной типа string[n] - n символов

вот именно. Как же тогда понимать заявления:

>проще один раз выделить 256 байт, чем на каждое >изменение длины строки менять


Sergey_Masloff   (2004-10-03 13:47:00) [5]

Семен Сорокин ©   (03.10.04 13:33) [16]
String[50] это и есть ShortString, вернее, его поддерживаемый языком подтип.
var
 s1 : ShortString;
 s2 : String[255];
это одно и то же.


Семен Сорокин   (2004-10-03 13:33:00) [6]

Sergey_Masloff   (03.10.04 13:24) [15]
это понятно, разговор был в контексте именно ShortString.


Sergey_Masloff   (2004-10-03 13:24:00) [7]

Семен Сорокин ©   (03.10.04 13:18) [14]
var
 S : String[50];


Семен Сорокин   (2004-10-03 13:18:00) [8]

Piter ©   (03.10.04 13:10) [12]
как это не пропускает?


а ты попробуй:
var
 a: shortstring[50];


jack128   (2004-10-03 13:16:00) [9]

Piter ©   (03.10.04 13:10) [12]
а что, длину shortstring можно менять?

длину СТРОКИ можно менять. Кол-во памяти, выделенной под эту строку - нет. Отсюда следует, что максимальная длина строки, хранящейся в переменной типа string[n] - n символов


Piter   (2004-10-03 13:10:00) [10]

Семен Сорокин ©   (03.10.04 12:52) [11]
такое объявление компилятор не пропускает


как это не пропускает?

проще один раз выделить 256 байт, чем на каждое изменение длины строки менять

а что, длину shortstring можно менять?


Семен Сорокин   (2004-10-03 12:52:00) [11]


> Piter ©   (03.10.04 11:33) [9]
> память выделяется разом - в 256 байт
>
> точно? Какой смысл выделять 256 байт, если объявлено:
> a: shortstring[50] ?

вроде как да,
такое объявление компилятор не пропускает.
А смысл я думаю в скорости - проще один раз выделить 256 байт, чем на каждое изменение длины строки менять.


ninja   (2004-10-03 11:39:00) [12]

Семен Сорокин ©   (02.10.04 13:30) [7]

спасибо ещё раз!
чорт, как я сам не догадался? очевидно вроде бы :))


Piter   (2004-10-03 11:33:00) [13]

Семен Сорокин ©   (02.10.04 12:50) [4]
насколько я помню, для ShortString не ведется количество ссылок


не ведет

память выделяется разом - в 256 байт

точно? Какой смысл выделять 256 байт, если объявлено:
a: shortstring[50]?


ninja   (2004-10-02 23:55:00) [14]

пасиб, буду пробовать!!


Семен Сорокин   (2004-10-02 13:30:00) [15]

CopyMemory(@desc, Pointer(DWORD(@s [1])-8), 8);
или
CopyMemory(@desc, Pointer(DWORD(pointer(s)-8), 8);

>В первом элементе массива должно было появиться 3, во втором - 1
наоборот, плохо читал


DiamondShark   (2004-10-02 13:25:00) [16]


> Куда же девался этот дескриптор??

Находится перед тем местом, куда указывает Pointer(Str)


ninja   (2004-10-02 13:11:00) [17]

Ihor Osov'yak ©   (02.10.04 12:46) [3]

Дескриптор находится перед первым элементом.
Либо поверьте на слово, либо поищите в документации, либо проверте отладчиком на уровне диссасемблера (там есть возможность просматривать фрагменты памяти).


дескриптор находится непосредственно перед началом строки? тогда, по идее, следущий код должен был сработать (может я и не прав конечно):

var
s: AnsiString;
desc: array[0..1] of DWORD;
begin
 s:='fdg';
 CopyMemory(@desc, Pointer(DWORD(@s)-8), 8);

В первом элементе массива должно было появиться 3, во втором - 1. На деле же там появляются какие-то астрономические цифры.
Что не так?


Семен Сорокин   (2004-10-02 12:50:00) [18]

насколько я помню, для ShortString не ведется количество ссылок, память выделяется разом - в 256 байт, и с обратным смещением хранится только длина.


Ihor Osov'yak   (2004-10-02 12:46:00) [19]

2 ninja   (02.10.04 12:19)

Пища для раздумий:

 s: string;
begin
 if pointer(s) <> @(s[1]) then ShowMessage('!!!!!')
 else
    ShowMessage('Ok');


если сомнения остаются  - напишите s: ansistring;

Теперь по существу.  
var
s: string;

если согласно установок компилятора string интерпритируется как ansistring - а это по умолчанию - то s - обычный указатель, указывающий на первый элемент строки. Дескриптор находится перед первым элементом.
Либо поверьте на слово, либо поищите в документации, либо проверте отладчиком на уровне диссасемблера (там есть возможность просматривать фрагменты памяти).

Борланды, наверное,  это сделали  с целью упрощения кодирования и для возможности финтов типа

var
s: string;
...
PChar(s)

Как по мне - довольно красивое решение.


ninja   (2004-10-02 12:38:00) [20]

да, под "простой" строкой именно shortstring я и имею ввиду. Извените за некорректность..


Страницы:   1 2

Наверх

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