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

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

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

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

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

11.2. Локальные переменные

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

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

Пример 1: Программа с процедурой, печатающей слово Hello 10 раз.

  var
    i: integer;

  procedure Hello10;
  var {Открытие раздела описаний локальных переменных}
    i: integer; {Описание локальной переменной i}
  begin
    for i:=1 to 10 do
      write('Hello_');
  end;

  begin
    for i:=1 to 5 do
      Hello10; {Пять раз вызываем процедуру}
  end.

Программа выведет 5 строк по 10 слов Hello.

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

Переменные, описанные в разделе описаний основной программы, будем называть глобальными. Глобальные переменные действуют как в теле программы, так и во всех процедурах. Если имя локальной и глобальной переменной, как в приведенном примере, совпадают, то это все равно разные переменные. Внутри процедуры при обращении к переменой i подразумевается, что это локальная переменная.

Представьте себе, что в рассмотренном примере локальная переменная i не описана. Синтаксической ошибки не возникнет, так как есть глобальная переменная, которая и будет использована как счетчик цикла внутри процедуры. Однако смысл программы измениться. Процедура изменит значение глобальной переменной i, которая используется как счетчик в другом цикле уже в основной программе. Последствия непредсказуемы. Скорее всего, программа выведет только одну строку со словами Hello. Но может и зациклится, выводя Hello до бесконечности.

Пример 2: Глобальная и локальная переменные.

  var
    x: real; {Описание глобальной переменной x}

  procedure P2;
  var
    x: real; {Описание локальной переменной x}
  begin
    x:=10; {Присваивание значения локальной переменной}
  end;

  begin
    x:=5; {Присваивание значения глобальной переменной}
    P2; {Вызов процедуры}
    writeln(x); {Вывод значения глобальной переменной}
  end.

Не смотря на то, что при вызове процедуры P2 выполнится инструкция x:=10; глобальная переменная x останется равной 5.

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

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

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