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. (Предостережение будущим пользователям!)
Память
Функция MemAvail для Delphi2?
Delphi 2
В Delphi 1, для того, чтобы получить самый большой возможный участок памяти, мы могли использовать функцию MemAvail, существует ли эквивалент этой функции в Delphi 2?
Нет. Но чтобы получить аппроксимированную сумму доступной памяти, можно воспользоваться функцией API GlobalMemoryStatus (через поле dwAvailVirtual возвращаемой структуры TMemoryStatus).
Steve Schafer
Как работать с блоками памяти размером более 64K?
Nomadic советует:
Так можно помещать в один блок памяти записи из TList (TCollection):
imlementation
{ To use the value of AHIncr, use Ofs(AHIncr). }
procedure AHIncr; far; external 'KERNEL' index 114;
const
NEXT_SELECTOR: string[13] = 'NEXT_SELECTOR';
function WriteData: THandle;
var
DataPtr: PChar;
i: Integer;
begin
Result := GlobalAlloc(GMEM_SHARE or GMEM_ZEROINIT, {pазмеp
большого блока});
if Result = 0 then Exit;
DataPtr := GlobalLock(Result);
{записываем кол-во эл-тов}
Inc(DataPtr, {pазмеp счетчика эл-тов})
for i := 0 to {некий}Count-1 do begin
if LongInt(PtrRec(DataPtr).Ofs) + {pазмеp подблока} >l= $FFFF then begin