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

           

Выдает значение вещественной переменной по



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 байт) может возникнуть переполнение при вычислении смещения последнего байта.

Содержание раздела