دامنه متغیرها (Scope)
متغیرهای سراسری و محلی، رویههای تودرتو و قواعد دید نامها.
هر متغیر کجا زندگی میکند؟
دامنه (Scope) یعنی: از کجا به کجای برنامه میتوانید یک متغیر را ببینید و استفاده کنید.
متغیر سراسری (Global)
متغیرهایی که قبل از همه رویهها تعریف میشوند — همهجا دیده میشوند:
program Global;
var
counter: integer; { سراسری }
procedure Bump;
begin
counter := counter + 1; { رویه سراسری را میبیند }
end;
begin
counter := 0;
Bump;
Bump;
Bump;
writeln(counter); { 3 }
end.
متغیر محلی (Local)
متغیرهای داخل رویه — فقط همانجا دیده میشوند و با پایان رویه نابود میشوند:
program Local;
procedure Test;
var
x: integer; { محلی — فقط داخل Test }
begin
x := 5;
writeln(x);
end;
begin
Test;
{ writeln(x); ❌ خطا! اینجا x وجود ندارد }
end.
همنام: محلی بر سراسری مقدم است
program Shadow;
var
x: integer; { سراسری }
procedure Show;
var
x: integer; { محلی همنام — سراسری را میپوشاند }
begin
x := 99;
writeln('محلی: ', x); { 99 }
end;
begin
x := 10;
Show;
writeln('سراسری: ', x); { 10 — دستنخورده }
end.
رویههای تودرتو
در پاسکال میتوان رویه را داخل رویه دیگر تعریف کرد — رویه داخلی به متغیرهای رویه بیرونی هم دسترسی دارد:
program Nested;
procedure Outer;
var
y: integer;
procedure Inner;
begin
y := y + 1; { متغیل رویه بیرونی! }
writeln('Inner: y=', y);
end;
begin
y := 10;
Inner;
Inner;
end;
begin
Outer;
end.
قاعده طلایی: کمترین سراسری!
متغیر سراسری مثل وایفای عمومی است — همه بهش دسترسی دارند و اشتباه یکی همه را اذیت میکند! قاعده حرفهای: هر متغیر را در کوچکترین دامنه ممکن تعریف کنید.
| تعریف در | دیده میشود در | عمر |
|---|---|---|
| قبل از رویهها | کل برنامه | کل برنامه |
| داخل رویه | همان رویه | از فراخوانی تا پایانش |
| داخل رویه داخلی | رویه داخلی + بیرونیهایش | فراخوانی بیرونی |
خلاصه
- سراسری = همهجا؛ محلی = فقط همان رویه
- همنام: محلی سراسری را میپوشاند
- رویه داخلی، متغیرهای بیرونی را میبیند
- هر متغیر در کوچکترین دامنه ممکن!
این مبحث بخشی از دوره آموزش کامل پاسکال است.