FreeBASIC マニュアルのトップに戻る

FreeBASIC TutIntroScope

目次→教本→いっしょに学ぼうIntroduction to Variable Scope←オリジナル・サイト

変数の範囲への序論 左にメニュー・フレームが表示されていない場合は、ここをクリックして下さい

←リンク元に戻る プログラム開発関連に戻る

変数の範囲(Scope)


範囲は、変数がどこで見えるかについて言及します。範囲の中では、プログラムで変数にアクセスできます。
範囲の、異なった階層を理解する前に、あなたは、FreeBasicのプログラムの構造を理解する必要があります。

プログラムの構造

完全なプログラムは、モジュールと呼ばれる、1個以上の .bas ファイルで構成されます。
各モジュールは、モジュール・レベルのコードと、サブルーチンと関数の中に含まれたコードの、両方を含むことができます。
モジュール・レベルのコードとは、サブルーチンや関数の中に含まれていないコードです。
下の短いコードは、モジュールの様々な部分を示しています。

Dim aInt As Integer '変数をモジュールレベルで宣言

Sub DoSomething
    Dim aInt As Integer '変数を Sub レベルで宣言

    ... 'この部分のコードは、Sub でローカルです
End Sub

Function DoSomethingElse() As Integer
    Dim aInt As Integer '変数を、func レベルで宣言

    ... 'この部分のコードは、func でローカルです
End Function

'モジュール・レベルのコード'
aInt = 5
DoSomething
aInt = DoSomethingElse ()



局所変数

あなたがモジュール・レベルで(Sharedを使わずに) 変数を定義するなら、変数は、ローカルのモジュールのレベルの範囲を持っている、と言います。
それは、モジュール・レベルのコードには見えますが、モジュールの中の、どんなサブルーチンや関数にも、見えません。
上の例の、モジュール変数 aInt は、モジュール・レベルのコードにだけ、見えます。

サブルーチンや関数の中で定義された変数は、サブルーチンや関数にローカルであり、モジュール・レベルのコードや、他のサブルーチンや関数には、見えません。

制御構造の中で定義される変数

If、For-Next、While-Wend、Do-Loop 構造の中で定義される変数は、制御構造ブロック・コードにローカルです。
すなわち、それらは、制御ブロックの開始から終了までの、領域の外で目に見えません。サブルーチンや関数の中で宣言された変数と、似ています。

共用変数

上の例で、あなたが、aInt を、サブルーチンや関数の中で見えるようにしたしなら、変数を Shared として宣言する必要があり、次に、サブルーチンや関数や制御ブロックの中で、同じ名前で変数を宣言してはいけません。
共用変数は、モジュール・レベルのコード、サブルーチンまたは関数レベルのコード、制御構造ブロックの中のコードで、見えます。

範囲の衝突

上のコードの例で、aInt を、Shared であると宣言して、サブルーチン、および関数でも aInt を宣言するなら、範囲の衝突が、発生します。1つの変数名が、異なった範囲のレベルで使われることになるからです。

コンパイラは、現在の範囲を考慮に入れて、その範囲の中で変数を写像することによって、これを解決します。
サブルーチンと関数は、モジュールより、範囲のレベルは低いので、aInt は、モジュール・レベルで宣言されたものではなく、Sub や関数の中に宣言された変数として参照されます。aInt は、共用変数として宣言されているにもかかわらずです。

複数のモジュール

範囲は、ただ一つのモジュール、すなわち、ただ一つの .bas ファイルに、制限されます。
しかし、ときとして、範囲を、1つのモジュールから別のモジュールに広げたいことがあります。
Common 命令文を使って、変数を宣言することで、モジュール間で変数を共有することができます。

各モジュールには、コンパイラが共通の変数を合わせるために、同じ Common 宣言がなければなりません。
あなたが、Common aInt as Integer として module1 で変数を宣言するなら、module2 でも、Common aInt as Integer がなければなりません。
共通の宣言がなければ、aInt は、module2 の中で見えません。

あなたは、Common に、Shared 属性を加えることができます。Common Shared は、範囲を複数のモジュールに広げるだけでなく、モジュールの中でも、範囲を広げます。
Common Shared は、ただ一つのモジュールの中で、Shared として、同じように作動します。
Common のように、変数へのアクセスを必要とする各モジュールで、対応する宣言を必要とします。


Scope...End Scope


あなたは、Scope...End Scope キーワードを使って、一時的な範囲ブロックを作成できます。
範囲ブロックは、一時的に働く変数を作成したいけれども、プログラムにおける名前の衝突を防ぎたいところで、複数行マクロを作成するとき、非常に役に立ちます。
下のコードは、範囲ブロックを作成する方法を示しています。

Scope
    Dim tmp As Integer
    ... '何らかのコード
End Scope


範囲ブロックの中で作成されたどんな変数の範囲も、ブロック自体に制限されます。
しかし、範囲ブロックは、周囲の範囲の見えることを引き継ぐので、範囲ブロックと同じ範囲で作成された変数は、ブロックの中で見えます。

例えば、あなたが、モジュール・レベルの範囲にある aInt を持っていて、範囲ブロックがモジュール・レベルの範囲にあるなら、aInt は、範囲ブロックの中で見えます。
範囲の衝突がもちろんない場合、その場合、範囲ブロックの中の変数は、範囲ブロックの外に同じ名前がある状態で、変数をくつがえします。


変数の寿命

変数の範囲は、変数の見えることを設定するだけではなく、変数の範囲は、変数の寿命も決定します。
変数は、一代で、いくつかの局面に直面しています。
作成、初期化、アクセス、破壊、の局面です。
When this occurs depends on the scope of a variable, that is, where the variable has been defined within the program.
この局面は、変数がプログラムの中で、どこで定義されたか、変数の範囲に依存して発生します。

モジュール・レベルの変数

モジュール・レベルの変数は、プログラムの寿命の間、存在しています。モジュール・レベルの変数は、プログラムの本体の中で宣言されるからです。
モジュール・レベルのコードは、プログラムの、メインの実行コードであり、プログラムが終わると、終わります。

サブルーチンと関数のレベルの変数

サブルーチンと関数の中で宣言された変数は、プログラムがサブルーチンと関数のボディーの中にある限り、存在しています。
sub/func に入ると、変数は、作成されて、初期化されて、sub/func の中でアクセスできるようになります。
サブルーチンや関数からいったん出ると、変数は破壊されます。

静的な変数

宣言している Sub/func 変数への 1つの例外が、Static 変数です。
Static 変数は、サブルーチンか関数への呼び出しの間、それらの値を維持します。そして、モジュールレベルの寿命もそうなります。

制御ブロックの変数

For-Next などの制御ブロックの中で宣言された変数は、制御ブロックが実行されている限り、存在しています。
制御ブロックを離れると、変数は破壊されます。

Scope...End Scope の変数

範囲ブロックの中で宣言された変数は、範囲ブロックが存在している限り、存在しています。
プログラムがいったん範囲ブロックを出ると、範囲ブロックの中で作成されたどんな変数も、破壊されます。

いっしょに学ぼう に戻る

最後、Sancho3によるレビュー(2018年2月06日)

←リンク元に戻る プログラム開発関連に戻る

ページ歴史:2018-02-11 11:49:22
日本語翻訳:WATANABE Makoto、原文著作者:WikiRick(Rick Clark aka rdc)

ホームページのトップに戻る

表示-非営利-継承