Итерация и рекурсия в программировании

Рис. 53. Наложение масок с помощью указателей

Type  
Point1 = record { маска 1 }
x,y: word  
end;  
Pnt1 = ^ Point1; { тип указателя, связанного с маской 1 }
   
Point2 = record { маска 2 }
y,x: word  
end;  
Pnt2 = ^ Point2; { тип указателя, связанного с маской 2 }
   
Var  
S: array[1..2] of word; { интерпретируемая область памяти }
p1: Pnt1; p2: Pnt2; { типизированные указатели для наложения масок }
x, y: word;  
   
begin  
S[1]:=10; s[2]:=20; { инициализация интерпретируемой области памяти }
p1:=@ S; { наложение маски 1 }
x:=p1^.x; y:=p1^.y; { интерпретация области памяти через маску 1: x =10; y = 20; }
...  
p2:=@ S; { наложение маски 2 }
x:=p2^.x; y:=p2^.y; { интерпретация области памяти через маску 2: x =20; y = 10; }
...  
         

Наложение масок с помощью указателей широко используется для создания динамических массивов переменной длины. При создании динамических массивов переменной длины память выделяется динамически в зависимости от размера массива. Интерпретация области памяти, отведенной под динамический массив, осуществляется через маску. Размерность маски рекомендуется выбирать так, чтобы она была рассчитана на максимальное количество данных интерпретируемого типа, которое может разместиться в пределах сегмента.

...  
Type  
Mas = array[1..10000] of word; { маска }
PMas = ^ Mas; { типизированный указатель, связанный с маской }
   
var  
P: PMas; { указатель для наложения маски }
A: Pointer; { адрес области памяти, выделенной для массива переменной длины }
n: word; { истинный размер массива }
i: word;  
   
begin  
write (“введите размерность массива = ”); readln(n);  
getmem(A, n * sizeof(word)); { динамическое выделение области памяти для массива }
p:=A; { наложение маски }
for i:=1 to n do readln(p^[i]); { интерпретация области памяти через маску }
...  
           

При использовании динамических массивов переменной длины следует обратить особое внимание на соотношение между верхней границей маски и верхней границей массива. При этом возможны две ситуации:

1. Число элементов динамического массива N больше верхней границы маски.

 
 


При попытке обратиться к элементу массива с номером, большим верхней границы маски, будет зафиксирована ошибка времени исполнения - выход за пределы верхней границы массива.

2. Число элементов динамического массива N меньше верхней границы маски.

 
 


При обращении к элементу массива с номером, большим N, ошибка времени исполнения не фиксируется, а происходит попадание в область памяти, не принадлежащую массиву размером N, но интерпретируемую через маску. В результате данные, которые располагаются сразу за массивом, могут быть испорчены.


6. рекурсивные структуры данных


Понравилась статья? Добавь ее в закладку (CTRL+D) и не забудь поделиться с друзьями:  



double arrow
Сейчас читают про: