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


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



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



Type

Pinteger : ^Integer;

Var

MyPtr : Pinteger;




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

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

Например,



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




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

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



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




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

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



Type
  pIntArr = ^IntArr;
  IntArr  = Array
[1..1000of Integer;
Var

  MyPtr : pIntArr;
Begin

  GetMem(MyPtr, 10
); { 10 = SizeOf(Integer) * 5 !!)
  { MyPtr[2]:=1; }

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

  MyPtr[2
]^:=1;
  FreeMem(MyPtr,10
);
End
;




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



type
  intarray = array
[0..20000of 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. (Предостережение будущим пользователям!)

Взято с www.delphiworld.narod.ru




DELPHI FAQ




EOMY TOP 100      Рейтинг@Mail.ru      Rambler's Top100