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

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

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

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

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

11.4. Параметры-значения и параметры-переменные

Существует два способа описывать параметры: как параметры-значения и как параметры-переменные. В предыдущем разделе использовались параметры-значения. Параметр-значение является просто локальной переменной, начальное значение которой задается при вызове процедуры.

Пример:

  var
    a, b: integer; {Глобальные переменные}

  procedure P3(a, b: integer); {Внутри процедуры символами a и b 
  обозначаются формальные параметры. Действия с ними никак не 
  повлияют на значения глобальных переменных a и b}
  begin
    a:=a+1;
    b:=b+1;
    writeln(a+b);
  end;

  begin
    a:=1;
    b:=1;
    P3(a, b);{Вызов процедуры, где в качестве фактических параметров 
              использованы значения глобальных переменных a и b}
    writeln(a, b);
  end.

Если в заголовке процедуры перед какими-либо из параметров поставить слово var, то это будут параметры-переменные. Например:

  procedure P3(var a, b: integer; c: real);

Здесь a и b – параметры-переменные, c – параметр-значение. При вызове процедуры фактический параметр, задающий значения этих формальных параметров не может быть выражением или константой, а должен быть обязательно переменной. То есть, недопустимы следующие вызовы:

    P3(x+y, y+1, z+2);
    P3(x, 2, z);

где x, y, z – глобальные переменные. Такие инструкции вызовут синтаксическую ошибку. В то же время синтаксически правильными будут вызовы:

    P3(x, y, z+1);
    P3(x, y, 2);

При использовании параметров-значений во время вызова процедуры происходит присваивание значения формальному параметру, то есть значение записывается в выделенные под хранение параметра ячейки памяти. При использовании параметров-переменных память под них не выделяется. Вместо этого на время работы процедуры они становятся синонимами тех переменных, которые указываются в качестве фактических параметров. Так при вызове P3(x, y, 2) формальные параметры a и b будут работать с теми же ячейками памяти, что и переменные x, y. Соответственно, если формальному параметру в процедуре присваивается новое значение, то и значение фактического параметра изменится. Воспроизведем пример, заменив тип параметров (добавим var перед их описанием):

  var
    a, b: integer; {Глобальные переменные}

  procedure P3(var a, b: integer); {Внутри процедуры символами a и b
  обозначаются формальные параметры. Теперь это 
  параметры-переменные и действия с ними повлияют на значения
  глобальных переменных a и b}
  begin
    a:=a+1;	 
    b:=b+1;	
    writeln(a+b);
  end;

  begin
    a:=1;
    b:=1;
    P3(a, b);{Вызов процедуры, где в качестве фактических параметров 
              использованы глобальные переменные a и b. 
              После вызова глобальные переменные увеличатся на 1}
    writeln(a, b);
  end.

Если без слова var программа выводила числа 4, 1, 1, то после его добавления получится 4, 2, 2.

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

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

3 комментария

  1. Alex_Kot

    во втором примере в ремарке к процедуре следует убрать слово …НИКАК…

  2. Taras

    Спасибо, исправил.

  3. Ruslan

    Вот тут написано: «Под формальные и фактические параметры-значения транслятор отводит разные области памяти. Поэтому результат выполнения процедуры может быть передан только через параметр-переменную.» http://pas1.ru/paramvar

    А у вас: «При использовании параметров-переменных память под них не выделяется. Вместо этого на время работы процедуры они становятся синонимами тех переменных, которые указываются в качестве фактических параметров.»

    Ничего не понятно.

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