Форум: "Потрепаться";
Текущий архив: 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.008 c