Сначала вы должны создать тип:
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. (Предостережение будущим пользователям!)
Просьба писать ваши замечания, наблюдения и все остальное,
что поможет улучшить предоставляемую информацию на этом сайте.
ВСЕ КОММЕНТАРИИ МОДЕРИРУЮТСЯ ВРУЧНУЮ, ТАК ЧТО СПАМИТЬ БЕСПОЛЕЗНО!