Система программирования Turbo Pascal



                


Пример 6.1


const

SizeOfReal = 6; {Длина переменной типа REAL}

N = 100; {Количество столбцов}

М = 200; {Количество строк} 

var

i,j : Integer;

PtrStr: array [1..N] of pointer;.

s : Real ; 

type

RealPoint =^Real;

{-------------------}

Function AddrR(i,j: word): RealPoint; 

{По сегменту i и смещению j выдает адрес вещественной переменной} 

begin

AddrR := ptr(seg (PtrStr [i]),

ofs{ PtrStr [i]) + (j -1) * SizeOfReal) 

end {AddrR} ;

{-------------------}

Function GetR(i,j: Integer): Real;

{Выдает значение вещественной переменной по сегменту i и смещению j ее адреса}

begin

GetR := AddrR(i,j)

end {GetR};

{-------------------}

Procepure PutR(i,j : Integer; x: Real);

{Помещает в переменную, адрес которой имеет сегмент i и смещение j, вещественное значение x}

begin

AddrR ( i , j ) : = x 

end {PutR};

{-------------------}

begin {Main}

for i :=1 to N do 

begin

GetMem (PtrStr [i] , M*SizeOfReal) ; 

for j := 1 to M do PutR(i, j, Random) 

end; 

S := 0;

for i := 1 to N do 

for j := 1 to M do

s := s +GetR(i,j);

WriteLn(s/(N * М) :12:10)

end {Main} .

В рассмотренном примере предполагается, что каждая строка размещается в куче, начиная с границы параграфа, и смещение для каждого указателя PTRSTR равно нулю. В действительности при последовательных обращениях к процедуре GETMEM начало очередного фрагмента следует сразу за концом предыдущего и может не попасть на границу сегмента. В результате, при размещении фрагментов максимальной длины (65521 байт) может возникнуть переполнение при вычислении смещения последнего байта.









Содержание  Назад  Вперед