Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2004.10.17;
Скачать: CL | DM;

Вниз

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;
Скачать: CL | DM;

Наверх




Память: 0.52 MB
Время: 0.05 c
1-1096754760
delphi-coder
2004-10-03 02:06
2004.10.17
Перевод любого файла в HEX


4-1094717557
Koala
2004-09-09 12:12
2004.10.17
Атрибуты файла


1-1097041909
Jay
2004-10-06 09:51
2004.10.17
StaticText


4-1095420430
Black CAT
2004-09-17 15:27
2004.10.17
И опять про CAD


1-1096976842
СержК
2004-10-05 15:47
2004.10.17
Ошибка при установке компонент