Наложение масок с помощью указателей
Открытые массивы
В качестве параметров-переменных процедуры или функции могут использоваться массивы и строки открытого типа, у которых не задаются размеры. В качестве фактического параметра можно использовать массив любого размера, но содержать он должен элементы того же типа, что и открытый массив. Истинный размер массива-фактического параметра определяется с помощью встроенной функции 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







