Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Потрепаться";
Текущий архив: 2003.08.07;
Скачать: [xml.tar.bz2];

Вниз

Достучаться до string   Найти похожие ветки 

 
Pat   (2003-07-18 18:32) [0]

var s:string;
Слышал, что по адресу @s[0] хранится длина строки s. А как бы это дело посмотреть?

P.S. Про функцию Length я знаю. Вопрос задал только в познавательных целях.


 
Skier   (2003-07-18 18:38) [1]

var
AStr : String;
ALength : Integer;
begin
AStr := "Hello, world !";
Move(Pointer(Integer(Pointer(AStr)) - 4)^, ALength, 4);
ShowMessage("Hack String Length = " + IntToStr(ALength));
ShowMessage("String Length = " + IntToStr(Length(AStr)));
end;



 
Skier   (2003-07-18 18:42) [2]

>Pat © (18.07.03 18:32)

> Вопрос задал только в познавательных целях.

А по смещению -8 лежит кол-во ссылок на строку.


 
Юрий Зотов   (2003-07-18 18:45) [3]

Можно и без Move - только приведениями типов.


 
McSimm   (2003-07-18 18:46) [4]

>Pat © (18.07.03 18:32)

Дело в том, что в OP существуют разные форматы представления строковых данных.
Длина строки в s[0] действительно есть в т.н. ShortString - такими были все строки в Паскале до появления длинных или динамически распределяемых строк. Их длина не может превышать 255 символов.

Задается такая строка либо явным указанием типа ShortString, либо установкой опции компилятора {$H-} - в этом случае тип String рассматривается как ShortString, либо указанием длины строки var S: string[10];

Динамические строки не могут быть измеряны байтом [0] - их длина хранится другим способом - об этом уже написали выше.


 
Verg   (2003-07-18 18:48) [5]

A ShortString is 0 to 255 characters long. While the length of a ShortString can change dynamically, its memory is a statically allocated 256 bytes; the first byte stores the length of the string, and the remaining 255 bytes are available for characters. If S is a ShortString variable, Ord(S[0]), like Length(S), returns the length of S; assigning a value to S[0], like calling SetLength, changes the length of S. ShortString uses 8-bit ANSI characters and is maintained for backward compatibility only.

Object Pascal supports short-string types—in effect, subtypes of ShortString—whose maximum length is anywhere from 0 to 255 characters. These are denoted by a bracketed numeral appended to the reserved word string. For example,

(C) Между прочим дельфозный хелп



 
McSimm   (2003-07-18 18:49) [6]

Возможно я неправильно понял и речь в вопросе шла именно о динамических строках?


 
Skier   (2003-07-18 19:03) [7]

>Юрий Зотов © (18.07.03 18:45)

Угу. Правда ещё переменная потребуется...

>Pat © (18.07.03 18:32)

Второй вариант :

var
AStr : String;
ASizePtr : Pointer;
ALength : Integer;
begin
AStr := "Hello, world !";
ASizePtr := Pointer(Integer(AStr) - 4);
ALength := Integer(ASizePtr^);
ShowMessage("Hack String Length = " + IntToStr(ALength));
ShowMessage("String Length = " + IntToStr(Length(AStr)));
end;


 
Pat   (2003-07-18 22:28) [8]

Вау!! Спасибо всем большое за ценную информацию.
Только вот еще один вопрос небольшой. Расскажите, пожалуйста, поподробнее про приведение типов (надеюсь, это так называется :)), например, Pointer() Integer() что в результате получится?


 
McSimm   (2003-07-20 12:04) [9]

Приведение типов SomeType(arg) позволяет компилятору рассматривать участок памяти по адресу @arg размером SizeOf(SomeType) как набор данных типа SomeType.

На примере с Pointer() и Integer() это означает, что четыре байта в памяти будут считаться указателем или целым числом соответственно.


 
Alex Konshin   (2003-07-20 13:03) [10]

http://akzhan.midi.ru/devcorner/akdeltnt-content/akdeltnt-0033.html


 
Vlad Oshin   (2003-07-20 14:32) [11]


> Юрий Зотов © (18.07.03 18:45)


а меня отругал за подобное :)



Страницы: 1 вся ветка

Форум: "Потрепаться";
Текущий архив: 2003.08.07;
Скачать: [xml.tar.bz2];

Наверх




Память: 0.46 MB
Время: 0.009 c
14-20777
chs2r
2003-07-21 15:30
2003.08.07
Как уменьшить размер программы?


14-20756
Nucl
2003-07-14 16:05
2003.08.07
Оформление программы


14-20739
~~~DEVELOPER~~~
2003-07-20 18:10
2003.08.07
Помогите с модемом!!


1-20563
cyberwolf
2003-07-23 23:48
2003.08.07
RichEdit скроллить до самого конца


1-20515
alois
2003-07-24 18:22
2003.08.07
Сортировка TStringList в обратном порядке





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
Английский Французский Немецкий Итальянский Португальский Русский Испанский