Локальні і глобальні змінні

Нагадаємо, що кожен модуль (процедура, функція, програма) складається з заголовка (procedure ..., function ..., program ...) і блоку.

Якщо блок будь-якої процедури p1 містить всередині процедуру p2. то кажуть, що p2 вкладена в p1.

Будь-які ідентифікатори, введені усередині якого-небудь блоку (процедури, функції) для опису змінних, констант, типів, процедур, називаються локальними для даного блоку. Такий блок разом з вкладеними в нього модулями називають областю дії цих локальних змінних, констант, типів і процедур.

Константи, змінні, типи, описані в блоці program, називаються глобальними. Здавалося б, простіше мати справу взагалі тільки з глобальними змінними, описавши їх все в program. Але використання локальних змінних дозволяє системі краще оптимізувати програми, робити їх більш наочними і зменшує ймовірність появи помилок.

При написанні програм, що мають вкладені модулі, необхідно дотримуватися наступних правил:

  1. Описувати ідентифікатори в тому блоці, де вони використовуються, якщо це можливо.
  2. Якщо один і той же об'єкт (змінна, тип, константа) використовуються в двох і більш блоках, то описати цей об'єкт треба в самому зовнішньому із них, що містить всі інші блоки, що використовують даний об'єкт.
  3. Якщо змінна, яка використовується в процедурі, повинна зберегти своє значення до наступного виклику цієї процедури, то таку змінну треба описати в зовнішньому блоці, що містить дану процедуру.

Локалізація змінних дає програмісту велику свободу у виборі ідентифікаторів. Так, якщо дві процедури a і b повністю відокремлені один від одного (тобто не вкладені одна в іншу), то ідентифікатори в них можуть бути обрані абсолютно довільно, зокрема, можуть повторюватися. В цьому випадку збігається ідентифікаторів відповідають різні області пам'яті, зовсім один з одним не пов'язані.

Якщо один і той же ідентифікатор описаний в блоці b і вдруге описаний у вкладеному в b блоці c. то треба пам'ятати, що ці два однакових ідентифікатора відповідають різним осередків пам'яті.

Глобальних змінних i і a відводяться два відділення пам'яті. Першими виконуються оператори a: = 2.0 і i: = 15. Потім викликається процедура p (a). В процесі роботи p відводиться осередок для локальної змінної i і туди засилається число 3. Після закінчення роботи процедури p цей осередок i програмою «забувається». Після повернення на оператор writeln програма знає тільки одну клітинку i - глобальну, тобто ту, яка містить число 15. Тому програма видасть на друк i = 15, a = 23.0, тому що a = 3 + 10 * 2.

Якщо локальна і глобальна змінна належать до одного і того ж складного типу, то цей тип треба описати в розділі type. а самі змінні описувати через цей загальний тип.

У цьому прикладі змінні a і b описані через загальний тип ab. Якщо ж локальна і глобальна змінні описані однаково, але не через загальний тип, то програма може «не понять», що ці змінні належать одному типу.

У цьому прикладі змінні a і b - однакові масиви, тобто типи цих змінних однакові, але програма, проте, «не вважає», що a і b належать одному типу. Це відбувається через те, що опис масивів дано в різних блоках.

Схожі статті