Наложение масок с помощью указателей
Открытые массивы
В качестве параметров-переменных процедуры или функции могут использоваться массивы и строки открытого типа, у которых не задаются размеры. В качестве фактического параметра можно использовать массив любого размера, но содержать он должен элементы того же типа, что и открытый массив. Истинный размер массива-фактического параметра определяется с помощью встроенной функции HIGH. Открытый массив задается как обычный массив, но без указания индексов и трактуется как маска. Индексирование элементов массива-фактического параметра начинается с нуля, а максимальный индекс равен значению функции HIGH.
... | |||
var | { фактические параметры - } | ||
Ar1: array[1..100] of integer; | { интерпретируемые } | ||
Ar2: array[1..1000] of integer; | { области памяти } | ||
s: integer; | |||
Procedure Sum(var X: array of integer; | { X – окрытый массив, его тип – } | ||
var summa: integer); | { маска } | ||
Var i: word; | |||
begin | |||
summa:=0; | |||
for i:=0 to high(X) do | { интерпретация элементов массива } | ||
summa:=summa + X[i]; | { через маску } | ||
end | |||
begin | |||
... | |||
Sum(Ar1,s); writeln(s); | |||
Sum(Ar2,s); writeln(s); | |||
... | |||
Наиболее общим методом совмещения типов является явное наложение масок с помощью указателей без использования специальных средств, встроенных в язык.
|
|
Алгоритм наложения маски с помощью указателя:
¨ определить тип маски;
¨ определить тип указателя, связанного с маской;
¨ определить переменную - типизированный указатель, связанный с маской;
¨ задать интерпретируемую область памяти;
¨ произвести наложение маски с помощью типизированного указателя. Наложение маски выполняется с помощью занесения адреса интерпретируемой области памяти в переменную-типизированный указатель, связанный с соответствущей маской. Через этот указатель открывается доступ к области памяти;
¨ выполнить интерпретацию области памяти через маску с использованием операции раскрытия ссылки.
Выполнение этого алгоритма иллюстрирует рис. 53.
X: =10 X: = 20
Y: =20 Y: = 10