|
|||
Параметры-массивы.19.1.2. Параметры-массивы.
Целые массивы компонентов могут появляться как фактические параметры в программах. Как и другие составные типы Паскаля, массивы обычно передаются по ссылке как параметры-переменные по соображениям эффективности. Если массив передается как параметр-значение, неявно присутствующая операция копирования должна будет скопировать каждый компонент. Однако, компоненты массивов могут эффективно связываться как с параметрами-значениями так и с параметрами-переменными. Определения раздела 9.1.4 не адекватны для случая алиасинга между индексным идентификатором и компонентом массива с таким индексом, переданным в параметре-значении.
Следующая программа обозначает некоторые сложности, которые могут возникнуть. Index передается параметру First, а Arr[Index] передается параметру Second. Таким образом, возникает алиасинг Second (через индекс Index) к First. First (или Index) инкрементируется до использования Second (или Arr[Index]). Однако, именно значение Arr[2], а не Arr[3] будет изменено, потому что связывание имени фактического параметра с именем формального параметра происходит при вызове процедуры, а не когда параметр-переменная используется.
PROGRAM Bind(INPUT, OUTPUT); VAR Arr: ARRAY [1..5] OF INTEGER; Index: INTEGER; PROCEDURE IncreaseParams(VAR First, Second: INTEGER); BEGIN {IncreaseParams} First := First + 1; Second := Second + 1; END; {IncreaseParams} BEGIN {Bind} FOR Index := 1 TO 5 DO BEGIN Arr[Index] := 1 END Index := 2; IncreaseParams(Index, Arr[Index]); WRITELN(‘Index is’, Index:2); FOR Index := 1 TO 5 DO BEGIN WRITELN(‘Arr[‘, Index:1, ‘] is ‘, Arr[Index] :2) END END. {Bind} Выполнение: OUTPUT: Index is 3 Arr[1] is 1 Arr[2] is 2 Arr[3] is 1 Arr[4] is 1 Arr[5] is 1 В этом особом случае, когда индекс в массиве и компонент с таким же индексом переданы как параметры-переменные, фактический параметр скопированный в тело процедуры должен иметь его индекс вычисленный в состоянии вызова, а не последующее состояние вычисленное в теле процедуры.
|
|||
|