Сторінка
4
num*sizeof(Longint) = 16383*4 = 65532 байти. Звільнення ділянки задається аналогічним викликом процедури FREEMEM: freemem(p, num*sizeof(Longint)). У програмі слід звільняти ділянки такого самого розміру, що одержувалися, інакше наслідки можуть стати непередбачуваними. Погляд на ділянку пам'яті як на послідовність елементів типу T реалізується за допомогою безтипового вказівника, перетвореного до типу ^T. Перетворений вказівник позначається виразом вигляду
^T(ім'я-вказівника). Наприклад, якщо p – безтиповий вказівник, то вираз Parl(p) позначає вказівник, перетворений до типу Parl=^Arl. Тоді вираз Parl(p)^ задає адресу першого байта ділянки, на яку встановлено p. І, нарешті, вираз Parl(p)^[k], 0£ k£ 16383, позначає елемент масиву з індексом k. Тобто замість імені масиву вживається вираз вигляду ^T(ім'я-вказівника). Перешкодою є те, що розмір ділянки пам'яті не може бути більше ніж 65532 байти, тобто максимальна кількість елементів масиву типу T – 65532/sizeof(T). Але подолати це обмеження дуже просто за допомогою масиву безтипових вказівників. Наприклад, якщо нам потрібний масив у сто тисяч елементів типу Longint, означимо масив із 10 вказівників та кількість елементів 10000 у одній ділянці вільної пам'яті:
p : array[ 0 9 ]of pointer; num : Longint =10000. Після встановлення вказівників на 10 ділянок for cnt:=0 to 9 do getmem(p[cnt], num*sizeof(Longint)) елемент масиву з індексом k, де 0£ k£ 9, задається виразом
Parl(p[k div num])^[k mod num]. І навпаки, вираз Parl(p[i])^[j] задає елемент масиву з індексом num*(i-1)+j. Приклад. Наведемо програму, за якою створюється масив із 135 тисяч елементів типу LongInt, тобто по 4 байти. Елементам присвоюються їх порядкові номери. Далі друкуються значення тих елементів, номери яких кратні 4000, а також восьми останніх. Перед захопленням пам'яті та після нього друкуються загальний розмір незайнятої частини купи та найбільший розмір її суцільної незайнятої ділянки. Якщо за якихось причин виконання програми завершується аварійно, слід придивитися саме до останніх величин. program arrptrfr;
const blocks=9;
type lng=longint; arl=array[0 0]of lng; parl=^arl;
var p : array[0 blocks-1]of pointer;
num, glob : lng ; k : lng; cnt: integer;
begin
num:=15000; glob:=num*blocks;
writeln( 'вільна пам''ять : ', memavail,
'; найбільша ділянка : ', maxavail);
for cnt:=0 to blocks-1 do getmem(p[cnt], num*sizeof(lng));
for k:=0 to glob-1 do
parl(p[k div num])^[k mod num]:=k;
cnt:=0;
for k:=0 to glob-1 do
begin
if (k mod 4000 = 0) or (k>glob-1-8) then
begin
write(k:8, parl(p[k div num])^[k mod num]:8);
cnt:=cnt+1;
end;
if cnt=4 then begin writeln; cnt:=0 end;
end;
writeln;
writeln('вільна пам''ять : ', memavail,
'; найбільша ділянка : ', maxavail);
readln;
end.