Форум: "Основная";
Текущий архив: 2004.10.17;
Скачать: [xml.tar.bz2];
ВнизAnsiString Найти похожие ветки
← →
ninja (2004-10-02 12:19) [0]привет. я в книжке прочитал, что структура AnsiString состоит из дескриптора (8 байт, первые 4 - длина, вторые 4 - число ссылок на строку, затем - сама строка). У простой строки дескриптор из 1 байта = длина строки. Так вот, при копировании CopyMem, например, в массив из byte, адрес для shortstring нужно указывать начиная с первого символа, т.е. @str1[1], а для ansi работает такая фигня: Pointer(str2). Куда же девался этот дескриптор??
← →
Семен Сорокин © (2004-10-02 12:28) [1]что по твоему простая строка, string по дефолту (директива {$H}) представляется именно как AnsiString, может ты имеешь ввиду ShortString?
← →
ninja (2004-10-02 12:38) [2]да, под "простой" строкой именно shortstring я и имею ввиду. Извените за некорректность..
← →
Ihor Osov'yak © (2004-10-02 12:46) [3]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)
Как по мне - довольно красивое решение.
← →
Семен Сорокин © (2004-10-02 12:50) [4]насколько я помню, для ShortString не ведется количество ссылок, память выделяется разом - в 256 байт, и с обратным смещением хранится только длина.
← →
ninja (2004-10-02 13:11) [5]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. На деле же там появляются какие-то астрономические цифры.
Что не так?
← →
DiamondShark © (2004-10-02 13:25) [6]
> Куда же девался этот дескриптор??
Находится перед тем местом, куда указывает Pointer(Str)
← →
Семен Сорокин © (2004-10-02 13:30) [7]CopyMemory(@desc, Pointer(DWORD(@s[1])-8), 8);
или
CopyMemory(@desc, Pointer(DWORD(pointer(s)-8), 8);
>В первом элементе массива должно было появиться 3, во втором - 1
наоборот, плохо читал
← →
ninja (2004-10-02 23:55) [8]пасиб, буду пробовать!!
← →
Piter © (2004-10-03 11:33) [9]Семен Сорокин © (02.10.04 12:50) [4]
насколько я помню, для ShortString не ведется количество ссылок
не ведет
память выделяется разом - в 256 байт
точно? Какой смысл выделять 256 байт, если объявлено:a: shortstring[50]
?
← →
ninja (2004-10-03 11:39) [10]Семен Сорокин © (02.10.04 13:30) [7]
спасибо ещё раз!
чорт, как я сам не догадался? очевидно вроде бы :))
← →
Семен Сорокин © (2004-10-03 12:52) [11]
> Piter © (03.10.04 11:33) [9]
> память выделяется разом - в 256 байт
>
> точно? Какой смысл выделять 256 байт, если объявлено:
> a: shortstring[50] ?
вроде как да,
такое объявление компилятор не пропускает.
А смысл я думаю в скорости - проще один раз выделить 256 байт, чем на каждое изменение длины строки менять.
← →
Piter © (2004-10-03 13:10) [12]Семен Сорокин © (03.10.04 12:52) [11]
такое объявление компилятор не пропускает
как это не пропускает?
проще один раз выделить 256 байт, чем на каждое изменение длины строки менять
а что, длину shortstring можно менять?
← →
jack128 © (2004-10-03 13:16) [13]Piter © (03.10.04 13:10) [12]
а что, длину shortstring можно менять?
длину СТРОКИ можно менять. Кол-во памяти, выделенной под эту строку - нет. Отсюда следует, что максимальная длина строки, хранящейся в переменной типа string[n] - n символов
← →
Семен Сорокин © (2004-10-03 13:18) [14]Piter © (03.10.04 13:10) [12]
как это не пропускает?
а ты попробуй:
var
a: shortstring[50];
← →
Sergey_Masloff (2004-10-03 13:24) [15]Семен Сорокин © (03.10.04 13:18) [14]
var
S : String[50];
← →
Семен Сорокин © (2004-10-03 13:33) [16]Sergey_Masloff (03.10.04 13:24) [15]
это понятно, разговор был в контексте именно ShortString.
← →
Sergey_Masloff (2004-10-03 13:47) [17]Семен Сорокин © (03.10.04 13:33) [16]
String[50] это и есть ShortString, вернее, его поддерживаемый языком подтип.
var
s1 : ShortString;
s2 : String[255];
это одно и то же.
← →
Piter © (2004-10-03 14:10) [18]jack128 © (03.10.04 13:16) [13]
длину СТРОКИ можно менять
ты имеешь в виду SetLenght? А толку? Что изменится для shortstring?
Отсюда следует, что максимальная длина строки, хранящейся в переменной типа string[n] - n символов
вот именно. Как же тогда понимать заявления:
>проще один раз выделить 256 байт, чем на каждое >изменение длины строки менять
← →
Piter © (2004-10-03 14:11) [19]Семен Сорокин © (03.10.04 13:33) [16]
разговор был в контексте именно ShortString
ну так string[n] если n<=255 то это shortstring
← →
GuAV © (2004-10-03 14:25) [20]
> ты имеешь в виду SetLenght? А толку? Что изменится для shortstring?
Нулевой символ в котором записана длина.
> Как же тогда понимать заявления
Во первых, действительно проще. Во вторых не потому, а потому что об"ём памяти занимаемый переменной какого либо типа изменить невозможно (переменные типа дин массивы и длиные строки занимают четыре байта).
← →
Piter © (2004-10-03 17:14) [21]я говорю об одном, а вы мне о другом. Ладно, забьем :)
P.S. Я знаю строение строк. Даже где-то типа заметки по этому поводу писал...
Страницы: 1 вся ветка
Форум: "Основная";
Текущий архив: 2004.10.17;
Скачать: [xml.tar.bz2];
Память: 0.5 MB
Время: 0.035 c