Работа с большими массивами
Распределите память кучи с помощью GetMem. Если вы имеете:
var a, b: array[0..30000]: Integer;
то попробуйте:
type TBigArray = array[0..30000] of Integer; var a, b: ^TBigArray;
и во внешнем блоке сделайте:
GetMem(a, SizeOf(TBigArray)); GetMem(b, SizeOf(TBigArray));
Также необходимо применять указатели на память вместо ссылок, например взамен:
a[0] := xxx;
необходимо использовать
a^[0] := xxx;
Взято из Советов по Delphi от Валентина Озерова
Сборник Kuliba
Заставить Delphi работать с достаточно большим массивом данных
procedure TForm1.Button1Click(Sender: TObject); type TMyRec = record i1, i2, i3: Integer; end; TMyArr = array[1..20000000] of TMyRec; PMyArr=^TMyArr; var A: PMyArr; begin GetMem(A, SizeOf(TMyArr)); A^[1].i1 := 100; ShowMessage('Ok' + IntToStr(A^[1].i1)); FreeMem(A); end;https://delphiworld.narod.ru/
DelphiWorld 6.0
В 16-битной версии Delphi нельзя сделать это непосредственно. В новой, 32-битной версии, это как-то можно сделать, но за два месяца колупания я так и не понял как. (Некоторые бета-тестеры знают как. Не могли бы они сообщить нам всю подноготную этого дела?)
В 16-битной версии Delphi вам необходимо работать с блоками по 32K или 64K и картой. Вы могли бы сделать приблизительно следующее:
type chunk: array[0..32767] of byte; pchunk: ^chunk; var BigArray: array[0..31] of pChunk;
Для создания массива:
for i := 0 to high(bigArray) do new(bigArray[i]);
Для получения доступа к n-ному байту в пределах массива (n должен иметь тип longint):
bigArray[n shr 15]^[n and $7FFF] := y; x := bigArray[n shr 15]^[n and $7fff];
Это даже осуществляет проверку выхода за границы диапазона, если вы установили в ваших настройках опцию "range checking"!
n должен находиться в диапазоне [0..32*32*1024] = [0..1024*1024] = [0..1048576].
Для освобождения массива после его использования необходимо сделать следующее:
for i := 0 to high(bigArray) do dispose (bigArray[i]);https://delphiworld.narod.ru/
DelphiWorld 6.0
Примечание от Vit: проблемы с большими массивами были актуальны в 16 битных средах (DOS, Windows 3x), когда использовалась сегментированная модель памяти и было затруднительно напрямую адресовать блоки больее 64K, в 32 разрядных системах подобные проблемы возникают значительно реже, при размерах массивов превосходящих 2Gb, что согласитесь даже в современном программировании дело далеко не частое. Для адресации более 2Gb см. статьи по AWE для 32 разрядных систем.