БОЛЬШОЙ FAQ ПО DELPHI



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

Дочь подходит к отцу-программисту, сидящему за компьютером:
- Папа... я беременна...
Отец, не отрывая глаз от монитора:
- А ты уверена, что от тебя?

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


 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..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. Синтаксис очень похож:


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




<< ВЕРНУТЬСЯ В ОГЛАВЛЕНИЕ



Материалы находятся на сайте https://exelab.ru/pro/



Видеокурс ВЗЛОМ