Работа с большими массивами.
Распределите память кучи с помощью GetMem. Если вы имеете:
то попробуйте:
var a, b: ^TBigArray;
и во внешнем блоке сделайте:
GetMem(b, SizeOf(TBigArray));
Также необходимо применять указатели на память вместо ссылок, например взамен:
необходимо использовать
Взято из Советов по Delphi от Валентина Озерова
Сборник Kuliba
Заставить Delphi работать с достаточно большим массивом данных
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;
http://delphiworld.narod.ru/
DelphiWorld 6.0
В 16-битной версии Delphi нельзя сделать это непосредственно. В новой, 32-битной версии, это как-то можно сделать, но за два месяца колупания я так и не понял как. (Некоторые бета-тестеры знают как. Не могли бы они сообщить нам всю подноготную этого дела?)
В 16-битной версии Delphi вам необходимо работать с блоками по 32K или 64K и картой. Вы могли бы сделать приблизительно следующее:
chunk: array[0..32767] of byte;
pchunk: ^chunk;
var
BigArray: array[0..31] of pChunk;
Для создания массива:
new(bigArray[i]);
Для получения доступа к n-ному байту в пределах массива (n должен иметь тип longint):
x := bigArray[n shr 15]^[n and $7fff];
Это даже осуществляет проверку выхода за границы диапазона, если вы установили в ваших настройках опцию "range checking"!
n должен находиться в диапазоне [0..32*32*1024] = [0..1024*1024] = [0..1048576].
Для освобождения массива после его использования необходимо сделать следующее:
dispose (bigArray[i]);
http://delphiworld.narod.ru/
DelphiWorld 6.0
Примечание от Vit: проблемы с большими массивами были актуальны в 16 битных средах (DOS, Windows 3x), когда использовалась сегментированная модель памяти и было затруднительно напрямую адресовать блоки больее 64K, в 32 разрядных системах подобные проблемы возникают значительно реже, при размерах массивов превосходящих 2Gb, что согласитесь даже в современном программировании дело далеко не частое. Для адресации более 2Gb см. статьи по AWE для 32 разрядных систем.
Отправить комментарий