Распределите память кучи с помощью 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 разрядных систем.

Добавить комментарий

Не использовать не нормативную лексику.

Просьба писать ваши замечания, наблюдения и все остальное,
что поможет улучшить предоставляемую информацию на этом сайте.

ВСЕ КОММЕНТАРИИ МОДЕРИРУЮТСЯ ВРУЧНУЮ, ТАК ЧТО СПАМИТЬ БЕСПОЛЕЗНО!


Защитный код
Обновить