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

Вниз

Length(string(P)) - маразм?   Найти похожие ветки 

 
SkyQuake ©   (2002-07-09 10:09) [0]

Преамбула:
var P:Pointer;
...
//Надо определить размер данных, на которые указывает P
Size:=Length(string(P));

Товарищи!
В условиях жёсткой нехватки времени была поставлена цель в ближайшую пятидневку найти таки об"ём данных на которые указывает P. Попытки связаные с SizeOf не увенчались успехом. И никто не знал почему ЭТО работает, но работает безотказно.


 
Fiend ©   (2002-07-09 10:13) [1]

Оно то работает, но на мой взгляд не оптимально.

Если Р указывает на PChar, то пользуйся StrLen(P)


 
Игорь Шевченко ©   (2002-07-09 10:31) [2]


> var P:Pointer;
> ...
> //Надо определить размер данных, на которые указывает P
> Size:=Length(string(P));


Это - неправильный способ.


 
MBo ©   (2002-07-09 10:35) [3]

>Игорь Шевченко
несколько раз уже говорили- не верит ;(


 
Eugene Lachinov ©   (2002-07-09 10:39) [4]

function GetMemSize(P : Pointer) : Integer;
begin
Result := (PLongInt(PChar(p)-4)^ and not $80000003) - 4
end;


 
Sasha9 ©   (2002-07-09 10:41) [5]

2Eugene Lachinov
а можно по подробнее откуда эти цифры?


 
Dimka Maslov ©   (2002-07-09 10:44) [6]

Это работает поскольку сначала выделяется память под строку типа string, а потом определяется длина строки. Для строк типа string длина располагается четырьмя байтами младше первого её символа.

Другой вопрос а как определяется длина блока, на который указывает P. В твоём случае указатель P представляется как PChar и программа ищет первый нулевой символ в блоке данных. Найдя его она вычисляет разность двух указателей, определяя таким образом длину блока. (функция StrLen)

Если же память выделена динамически вручную, то и тут есть способы определить её размер. Любой менеджер динамической памяти имеет таблицу, в которой содержатся все указатели на выделенные им блоки памяти. К примеру для блоков памяти выделенных LocalAlloc есть функция LocalSize, GlobalAlloc - GlobalSize, HeapAlloc - HeapSize и т.д. Поскольку динамическое выделение памяти GetMem, New, AllocMem - это скрытые вызовы WinAPI достаточно определить какой именно сиситемной функцией было произведено выделение памяти.

Особый случай, не поддающийся определению размера - это прямое присваивание указателей на локальные или глобальные переменные. Тут длина блока будет зависеть от типа пременной на которую ссылается указатель и определить её при выполнении программу нельзя. Надо следить за размерами на этапе написания кода.



 
Eugene Lachinov ©   (2002-07-09 10:58) [7]

Цифры взяты из Source\Rtl\Sys\getmem.inc, только вот для каких Delphi не помню (5 или 6), может что-то поменялось



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

Текущий архив: 2002.07.22;
Скачать: CL | DM;

Наверх




Память: 0.48 MB
Время: 0.011 c
1-70758
Дремучий
2002-07-09 13:40
2002.07.22
хочу сделать format main.pas /1.cfg, дайте ссылки


1-70700
SuperVK
2002-07-11 10:09
2002.07.22
Как убрать первый нередактируемый столбец в TStringGrid?


1-70785
AL2002
2002-07-10 09:52
2002.07.22
Нарисовать треугольник


3-70667
Oleon
2002-06-28 12:49
2002.07.22
Как програмно обработать ошибку.


3-70619
Боева Наталья
2002-07-01 07:23
2002.07.22
Обновление данных