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

Вниз

Как узнать тип и размер объекта на который указывает указатель?   Найти похожие ветки 

 
Константинов ©   (2004-09-05 13:02) [0]

Допустим есть TList.
var
P1 : ^byte;
P2 : ^string[25];
P3 : ^double;
P : Pointer;
begin
Добовляем элементы в список...
GetMem(P1,SizeOf(byte));
GetMem(P2,25);
GetMem(P3,SizeOf(bouble));
List.Add(P1);
List.Add(P2);
List.Add(P3);
...
Теперь необходимо считать данные из TList
или освободить память ( FreeMem )
for I := 0 to List.Items.Count - 1 do
begin
 P := List[I];
 Я получил адрес памяти, но не знаю какого типа данные и      сколько байт выделено процедурой GetMem...
end;

Есть ли функции, позволяющие получить хотя бы размер выделенной памяти?

Если нет, то подскажите способ хранения "разнокалиберных" данных
в одном списке.

Заранее спасибо!


 
jack128 ©   (2004-09-05 13:09) [1]

Константинов ©   (05.09.04 13:02)
Есть ли функции, позволяющие получить хотя бы размер выделенной памяти?

если покопаться в менеджере памяти, но наверно можно размер получить.. Но не нужно.


> Если нет, то подскажите способ хранения
>"разнокалиберных" данных
> в одном списке.

type
 TDataType: (dtInteger, dtByte, dtDouble, dtSingle);
 PDataRec = ^TDataRec;
 TDataRec = record
   DataType: TDataType;
   case TDataType of
      dtInteger: (i: Integer);
      dtByte: (b: Byte);
      dtDouble: (d: Double);
      dtSingle: (s: Single);
 end;


в поле DataType храни признак на какого типа данные у тя храняться и в зависимости от этого обращайся к вариантной части записи..


 
Defunct ©   (2004-09-05 13:11) [2]

Допустим есть TList.
var
P1 : ^byte;
P2 : ^string[25];
P3 : ^double;
P : Pointer;
begin
Добовляем элементы в список...
GetMem(P1,SizeOf(byte));
GetMem(P2,25); - Ошибка! должно быть SizeOf(P2^);
GetMem(P3,SizeOf(bouble));

> Есть ли функции, позволяющие получить хотя бы размер выделенной памяти?

нет

Если нет, то подскажите способ хранения "разнокалиберных" данных
в одном списке.


Например так:

PUntypedRecord = ^TUntypedRecord
TUntypedRecord = Record
 data : Pointer;
 size : Integer;
End;

Var UntypedData : PUntypedRecord;
   P1          : ^Double;
   P2          : ^String[25];

New(UntypedData);
New(P1);
UntypedData.Data := P1;
UntypedData.Size := SizeOf(P1^);
List.Add(UntypedData);

New(UntypedData);
New(P2);
UntypedData.Data := P2;
UntypedData.Size := SizeOf(P2^);
ListAdd(UntypedData);

и т.п.

Еще можно использовать Stream (там где это целесообразно, когда большие данные).


 
begin...end ©   (2004-09-05 13:12) [3]

ИМХО, такое возможно только для типизированных указателей (в твоём случае это P1 и P3, P2 - вообще непонятно, что такое), например:

SizeOf(P1^)

Только непонятно как-то Вы память выделяете: вроде для типизированных указателей обычно New/Dispose используют.


 
Семен Сорокин ©   (2004-09-05 13:18) [4]

Может автору Varinat подойдет?


 
Семен Сорокин ©   (2004-09-05 13:18) [5]

[4] Varinat = Variant :)


 
Defunct ©   (2004-09-05 13:43) [6]

> begin...end ©   (05.09.04 13:12) [3]
> что такое), например:

> SizeOf(P1^)

>>Defunct ©   (05.09.04 13:11) [2]

>> P1          : ^Double;


SizeOf(P1^) = SizeOf(Double) = 8


 
begin...end ©   (2004-09-05 14:26) [7]


> [6] Defunct ©   (05.09.04 13:43)

Э-э... Не понял...
На счёт SizeOf(P1^) = SizeOf(Double) = 8 я в курсе, и что?


 
Константинов ©   (2004-09-05 22:48) [8]

Спасибо! В принципе я и расчитывал, что придется определить тип, примерно как Defunct ©   (05.09.04 13:11) [2]
А насчет вариантных записей, думаю не помогут. Хранятся записи с полями из динамических массивов. Вобще-то я здорово запутался где и как уберечься от утечки памяти. Создал класс на базе TList но при попытке очистить лист вылетает AV вот сижу и думаю где его искать...


 
Erik1   (2004-09-06 13:33) [9]

Я думаю, что лучшее решение в [1]. Можно его усовершенствовать, например:
type
TDataType: (dtInteger, dtByte, dtDouble, dtSingle, dtCustom);
RPointer = record
  Size: Integer;
  Data: Pointer;
end;
PDataRec = ^TDataRec;
TDataRec = record
  DataType: TDataType;
  case TDataType of
     dtInteger: (i: Integer);
     dtByte: (b: Byte);
     dtDouble: (d: Double);
     dtSingle: (s: Single);
     dtCustom: (c: RPointer);
end;
Думаю идея понятна или закинуть поле Size прямо в TDataRec, тут надо смотреть по типу данных.



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

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

Наверх




Память: 0.49 MB
Время: 0.038 c
4-1091686363
malamba
2004-08-05 10:12
2004.09.19
отслеживание курсора и перерисовка изображения


14-1093785588
Seldon
2004-08-29 17:19
2004.09.19
help к MemProof


8-1087988020
PenguinX
2004-06-23 14:53
2004.09.19
TFastDIB и переворот изображения.


1-1094285320
HF-Trade
2004-09-04 12:08
2004.09.19
TBitBtn


1-1093890542
Arcady
2004-08-30 22:29
2004.09.19
как справиться с генератором тестов