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

Вниз

Достучаться до 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;
Скачать: CL | DM;

Наверх




Память: 0.49 MB
Время: 0.015 c
3-20382
AkaSaint
2003-07-15 21:22
2003.08.07
TDataSetProvider.OnUpdateError: в DataSet нет ключевого поля


4-20844
deadfrog
2003-06-05 11:42
2003.08.07
ShellExecute


3-20400
Silver_
2003-07-15 17:11
2003.08.07
ORDER BY (GROUP BY) :MyField


1-20566
Yurique
2003-07-24 04:06
2003.08.07
No BDE


14-20722
SF
2003-07-23 17:36
2003.08.07
Технология Web Broker и Web-сервер