![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
AnsiString [D4]
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 я и имею ввиду. Извените за некорректность..