22nd
Июн

Аналоги динамических массивов в TP и PascalABC?

Posted by Chas under Пост-обзор

полноценного открытого массива скажем type arr=array of integer;
Pascal не поддерживает.

Serge_Bliznykov:
может лучше посмотреть на использование динамических структур (связных списков) ?! Это может оказаться и надежнее, и красивее и эффективнее, чем манипуляции с указателями…

а вообще, мне удалось обмануть это Pascal.ABC таким образом:

type mA=array[1..1] of integer;
mAFictive=array[1..10000] of integer;
pAFict = ^mAFictive;

procedure ArrayAdd(var AAA : pAFict; var N : integer; val: integer);
var siz : word;
pAF, p4Free : pAFict;
i : integer;
begin
n:=n+1;
siz:=n*SizeOf(mA);
GetMem(pAF,siz); {выделяем новую область памяти}
// копируем туда старые данные
for i:=1 to n-1 do pAF^ := AAA^; // можно через CopyMem переписать...
p4Free := AAA; {сохраним указатель на ту память, чтобы была выделена ранее}
AAA := pAF; {теперь новая память доступна}
FreeMem(p4Free); {очистим предыдущий указатель}
AAA^[n]:=val;
end;

var
i, n : integer;
pAF : pAFict;
begin
WriteLn('Хакерские приемы в PASCAL.ABC');
n:=0;
ArrayAdd( pAF, n, 200 );
ArrayAdd( pAF, n, 300 );
ArrayAdd( pAF, n, 400 );
for i:=1 to N do
// Writeln(i, ' = ', pAFict(A)^);
Writeln(i, ' = ', pAF^);

FreeMem(pAF); // обязательно освободить память...
readln;
end.

Кстати, если выделить память ОДИН раз (сразу, сколько надо – задать нужное N и выделить), тогда не понадобятся трюки с копированием из старой области памяти в новую, это весьма положительно скажется на быстродействии…

тема на форуме

Похожие статьи