Персональная страничка
Диканева Тараса
Викторовича

Главная \ Преподавательское \ Программирование для начинающих

11. Процедуры и функции

Предыдущий раздел:

Следующий раздел:

11.6. Передача массивов в качестве параметров

Как вы знаете с отдельными элементами массивов можно работать также как с обычными (скалярными) переменными. Соответственно можно использовать их в качестве фактических параметров. Однако, может потребоваться передать процедуре не отдельные элементы, а весь массив целиком. При этом недопустим такой, например, способ описания параметра:

  procedure P(a: array [1..10] of integer); {Так нельзя}

Тип параметра должен быть или скалярным или заранее определенным в разделе type. То есть правильным будет следующее описание:

  type
    TArray = array [1..10] of integer;
  var
    x: TArray;

  procedure P(a: TArray);

Такую процедуру P можно вызывать, указав в качестве фактического параметра, например, глобальную переменную x.

Пример: Программа, вычисляющая сумму элементов массива.

  const
    n = 10;
  type
    TArray = array [0..n-1] of integer;
  var
    x: TArray;
    i, sum: integer;

  procedure Summa(a: TArray; var s:integer);
  var
    i: integer;
  begin
    s:=0; {Операции с параметром-переменной s отразятся на
      фактическом параметре – глобальной переменной sum}
    for i:=0 to n-1 do
      s:=s+a[i];
  end;

  begin
    for i:=0 to n-1 do
      readln(x[i]);
    Summa(x, sum); {К моменту вызова процедуры, переменной sum
      ничего еще не присвоили. Это не страшно, так как начальное
      значение параметра s для работы процедуры несущественно}
    writeln(sum);
  end.

При вызове процедуры содержимое массива x будет скопировано в массив a. Глобальная переменная sum на время работы процедуры приобретет синоним s. То есть, присваивая что-то переменной s, мы тем самым изменяем и переменную sum. В итоге программа выведет сумму элементов введенного пользователем массива.

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

  procedure Summa(var a: TMassive; var s: integer);

Следующий раздел:

Предыдущий раздел:

Добавить комментарий