Распределите память кучи с помощью GetMem. Если вы имеете:
Code: |
var a, b: array[0..30000]: Integer; |
то попробуйте:
Code: |
type TBigArray = array[0..30000] of Integer; var a, b: ^TBigArray; |
и во внешнем блоке сделайте:
Code: |
GetMem(a, SizeOf(TBigArray)); GetMem(b, SizeOf(TBigArray)); |
Также необходимо применять указатели на память вместо ссылок, например взамен:
Code: |
a[0] := xxx; |
необходимо использовать
Code: |
a^[0] := xxx; |
Взято из Советов по Delphi от Валентина Озерова
Сборник Kuliba
Заставить Delphi работать с достаточно большим массивом данных
Code: |
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 и картой. Вы могли бы сделать приблизительно следующее:
Code: |
type chunk: array[0..32767] of byte; pchunk: ^chunk;
var BigArray: array[0..31] of pChunk; |
Для создания массива:
Code: |
for i := 0to high(bigArray) do new(bigArray[i]); |
Для получения доступа к n-ному байту в пределах массива (n должен иметь тип longint):
Code: |
bigArray[n shr15]^[n and$7FFF] := y; x := bigArray[n shr15]^[n and$7fff]; |
Это даже осуществляет проверку выхода за границы диапазона, если вы установили в ваших настройках опцию "range checking"!
n должен находиться в диапазоне [0..32*32*1024] = [0..1024*1024] = [0..1048576].
Для освобождения массива после его использования необходимо сделать следующее:
Code: |
for i := 0to high(bigArray) do dispose (bigArray[i]); |
https://delphiworld.narod.ru/
DelphiWorld 6.0
Примечание от Vit: проблемы с большими массивами были актуальны в 16 битных средах (DOS, Windows 3x), когда использовалась сегментированная модель памяти и было затруднительно напрямую адресовать блоки больее 64K, в 32 разрядных системах подобные проблемы возникают значительно реже, при размерах массивов превосходящих 2Gb, что согласитесь даже в современном программировании дело далеко не частое. Для адресации более 2Gb см. статьи по AWE для 32 разрядных систем.
Просьба писать ваши замечания, наблюдения и все остальное,
что поможет улучшить предоставляемую информацию на этом сайте.
ВСЕ КОММЕНТАРИИ МОДЕРИРУЮТСЯ ВРУЧНУЮ, ТАК ЧТО СПАМИТЬ БЕСПОЛЕЗНО!