Хелпикс

Главная

Контакты

Случайная статья





Параметры-массивы.



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

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

 



  

© helpiks.su При использовании или копировании материалов прямая ссылка на сайт обязательна.