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

FreeBASIC ProPgVariableLifetime

目次→教本→プログラマーのための案内Simple Variable Lifetime vs Scope←オリジナル・サイト

単純な変数の有効期間と範囲 左にメニュー・フレームが表示されていない場合は、ここをクリックして下さい

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

単純変数有効期間 は、その範囲(Scope)に対する静的メモリ割り当ての宣言キーワードから作成されます。

序文:
上記のように静的に割り当てられた変数は、有効期間は通常周囲のスコープと一致します。しかし、そうでない場合は、これより長くなる可能性があります。


周囲の範囲に一致する有効期間を宣言する構文
どこでも、次のように(または同様の構文で)宣言された変数の場合:

(1) Dim Shared As datatype [Ptr] variablename ...
又は
(2) Var Shared variablename = expression
(equivalent to: 'Dim Shared As Typeof((expression)) = expression')
又は
(3) {Dim|Static} Shared As datatype [Ptr] variablename ...
又は
(4) [Static] Var Shared variablename = expression
(equivalent to: '{Dim|Static} Shared As Typeof((expression)) = expression')
又は
(5) Common [Shared] As datatype [Ptr] variablename

これらの変数は、常にその周囲の範囲(グローバル範囲、または範囲ブロック、または複合命令文ブロック、または手続き範囲)に対応する有効期間があります。

(1) または (2) の構文では、ローカル変数は、常にその宣言時にプログラムのスタック上に割り当てられ、その範囲を外る時に自動的に解放されます。

(3)(4)(5) の構文では、グローバル変数は、常に実行可能ファイルの .BSS または .DATA セクションで割り当てられます(その範囲と有効期間は、プログラムの作成で始まり、プログラムの終了で終わります)。

周囲の範囲よりも存続期間が大きい可能性がある宣言構文
どこでも、次のように(または同様の構文で)宣言された変数の場合:

Static Shared As datatype [Ptr] variablename ...

この変数の存続期間は、常にプログラムの期間に等しいため、ローカル範囲ブロックで宣言されている場合でも、周囲のスコープより長くなります(グローバル範囲で宣言されている場合は、周囲の範囲と一致します)。

静的変数は、常に実行可能ファイルの .BSS または .DATA セクションで割り当てられます(その有効期間はプログラムの作成で始まり、プログラムの終了で終わります)。

複合命令ブロックまたは手続き範囲でこのような静的変数を宣言する意義:
-「Dim」の場合、「Static」キーワードは、複合命令文ブロックまたは手続き範囲で使われ、複合命令文ブロックまたは手続きの最後で範囲が停止する変数を宣言します。
- ただし、「Dim」と異なり、「Static」キーワードで宣言された変数は、複合命令ブロックの連続ループまたは手続きの連続呼び出しの間で値を保持するため、有効期間は異なります。
- 要約すると、宣言された静的変数はローカル範囲を持ちますが、その有効期間はグローバル範囲変数の有効期間と同じです。
- そのため、同じ名前の静的変数は、複数の異なる複合命令文ブロックおよび異なる手続き範囲で宣言できます。
そして、これらの各変数は独立したままで、独自のローカル範囲で独自の値を保持します。

ローカル範囲で宣言されたさまざまな変数間の有効期間の比較:
手続き範囲で宣言されたローカル変数と静的変数

Dim Shared As ZString Ptr pzl ' global variable to memorize the local Zstring address
Dim Shared As ZString Ptr pzs ' global variable to memorize the static Zstring address

Declare Sub prntSubString (ByVal p As ZString Ptr, ByVal size As Integer)


Sub s ()                                          ' beginning of procedure scope
    Dim As ZString * 15 zl = "local variable"     ' declare/initialize a local Zstring
    pzl = @zl                                     ' memorize the local Zstring address
     
    Static As ZString * 16 zs = "static variable" ' declare/initialize a static Zstring
    pzs = @zs                                     ' memorize the static Zstring address
     
    Print "     From inside the procedure scope:"
    prntSubString(pzl, 14)                        ' display address/content of the local zstring
    prntSubString(pzs, 15)                        ' display address/content of the static zstring
End Sub                                           ' end of procedure scope

Print "Lifetimes comparison between local/static variables declared in a local scope:"
s() ' call the procedure

Print "     From outside the procedure scope:"
prntSubString(pzl, 14) ' display address/content of the local zstring after going out its scope
prntSubString(pzs, 15) ' display address/content of the static zstring after going out its scope

Sleep


Sub prntSubString (ByVal p As ZString Ptr, ByVal size As Integer)
    Print , "&h" & Hex(p, SizeOf(Any Ptr) * 2),
    Print """";
    For I As Integer = 0 To size - 1
        Dim As UByte u = (*p)[I]
        If u < Asc(" ") Then
            Print " ";
        Else
            Print Chr(u);
        End If
    Next I
    Print """"
End Sub

出力例:
Lifetimes comparison between local/static variables declared in a local scope:
	 From inside the procedure scope:
			  &h0019FE74    "local variable"
			  &h00407004    "static variable"
	 From outside the procedure scope:
			  &h0019FE74    " p@ Cp@ ?��  Y "
			  &h00407004    "static variable"

参照
プログラマーのための案内に戻る
←リンク元に戻る プログラム開発関連に戻る
ページ歴史:2021-08-31 04:35:32
日本語翻訳:WATANABE Makoto、原文著作者:fxm

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

表示-非営利-継承