Использование указателей на целое
|
Дочь подходит к отцу-программисту, сидящему за компьютером:
- Папа... я беременна...
Отец, не отрывая глаз от монитора:
- А ты уверена, что от тебя?
|
Сначала вы должны создать тип:
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. (Предостережение будущим пользователям!)
|