Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Основная";
Текущий архив: 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.033 c
3-1095619050
Dio
2004-09-19 22:37
2004.10.17
Компанент


14-1096288159
quickblack
2004-09-27 16:29
2004.10.17
Нужен Delphi 7 или6


14-1096463530
DSKalugin
2004-09-29 17:12
2004.10.17
MS SQL vs FireBird


1-1096958807
СержК
2004-10-05 10:46
2004.10.17
Номера цветов


3-1094999217
ANB
2004-09-12 18:26
2004.10.17
Проблема с ADO и FoxPro





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский