Использование указателей на целое

Previous  Top  Next

    
 

 

 

Сначала вы должны создать тип:

Code:

Type Pinteger : ^Integer;

 

Var MyPtr : Pinteger;

 

Мне кажется, что в начале вы использовали плохой пример, имеет смысл использовать 32-битный указатель для 16-битной величины или распределять 10 байт для переменной.

 

Pascal позволяет вам использовать методы NEW и DISPOSE, которые автоматически распределяют и освобождают правильные размеры блока.

 

Например:

Code:

NEW(MyPtr) = GetMem(MyPtr, Sizeof(MyPtr))

 

Возможно, вы захотите подсчитать количество целочесленных переменных. В этом случае ознакомьтесь с возможностями TList. Пока лучше используйте линейный массив (или указатель на первый элемент, чтобы вычислить их количество, достаточно разделить количество занимаемой массивом памяти на количество элементов).

 

Для полноты, это должно быть:

 

Code:

NEW(MyPtr) = GetMem(MyPtr, SizeOf(MyPtr^));

 

SizeOf(MyPtr) всегда будет равен 4 байта, как 16-битный указатель.

 

Если я правильно разобрался в том, что вы хотите (динамический массив целых, количество элеметнов которого может быть известно только во время выполнения приложения), вы можете сделать так:

 

Code:

Type

pIntArr = ^IntArr;

IntArr  = Array[1..1000] of Integer;

Var

MyPtr : pIntArr;

Begin

GetMem(MyPtr, 10); { 10 = SizeOf(Integer) * 5 !!)

{ MyPtr[2]:=1; }

// <<<< Заполняем массив >>>>

MyPtr[2]^:=1;

FreeMem(MyPtr,10);

End;

 

Технология похожа на ту, которая Delphi использует при работе с pchar. Синтаксис очень похож:

 

Code:

type

intarray = array[0..20000] of integer;

 

procedure TForm1.Button1Click(Sender: TObject);

var

xptr:  ^IntArray;

begin

GetMem(xptr, 10);

xptr^[idx] := 1{ где idx от 0 до 4, поскольку мы

                     имеем 10 байте = 5 целых }

FreeMem(xptr, 10);

end;

 

Обратите внимание на то, в вам в действительности нет необходимости распределять массив для 20,000 элементов, но проверка диапазона Delphi не будет работать, если диапазон равен 20,000. (Предостережение будущим пользователям!)

 

©Drkb::00258

       

Взято с http://delphiworld.narod.ru