アセンブリレベルでjmp命令とかあるのに
それに対応する構文がないのは流石に欠陥じゃね。
と、のっけからグチを書いてみた訳ですが、
流石に幾らなんでもGoTo文対応してないのマズくね?
まぁ様はGoTo文使わずに関数化かサブプロシージャ化しろって事ですかね。
とりあえず書き始める前に、
今回の補足解説はプログラミング技術の根っこの方に多少関わってくる部分で、
専門用語で適当な語句を探すなら
「変数の名前空間とスコープ範囲」
というやたら嫌らしいタイトルになっちゃう解説です。
かなり難しいので心して・・・
まず、以前の補足で、
Function
Test(a,c)
End Function
となっている場合、
「a」と「c」はFunction〜End
Function間では
その名前の変数として扱える
という様な事を書きました。
ですから、
a=a+10
と出来るわけです。
・・・でもこれ「変数の宣言」が不要なVBSだと「普通にaっていう変数に数値代入してるだけじゃね」
って言われかねません。
そこで・・・
プログラム(msgbox
"")などの先頭に以下の1行を追加しましょう。
Option
Explicit
これを追加してその下に
a=a+10
とやると普段は出ない
「この変数は宣言されていません」
というエラーが出ます。
本来プログラムでは
変数を宣言→その変数を利用
という流れを取るのが普通であり、VBSの場合は
実行する時に宣言されていない変数の利用がチェックされ、
実行の前処理で勝手に宣言を行ってくれる為、宣言が不要になっているのです。
※これを専門的な用語を使って説明すると・・・(以下5行理解する必要はありません。)
プログラムはコンパイルによって一旦機械語(0と1の並び)に翻訳されてから
その機械語コード実行されるのだが、
コンパイル時に非宣言変数のチェックが行われ、宣言されていない変数が利用されている場合、
機械語の中にその変数の宣言を勝手に埋め込んでくれるため、プログラム上で宣言する必要が無い
という事になります。
ですので、プログラムとしての本来の形
変数を利用する前に宣言を事前に行っておかなければならない
という指定を行うのがOption
Explicitです。
この場合、
Option Explicit
Dim a
a=a+10
Dim
[変数名]
と記述して「この名前の変数を利用します」という宣言文が存在する事は以前解説しました。
さて・・・
Option
Explicit
Dim Result
Result =Test(10,10)
Function
Test(a,c)
a=a+10
End Function
として見ましょう。
Function
Test(a,c)の下、
a=a+10
ですが、普通ならここで「「Dim
a」してないんだからエラー出るだろ。」って思うでしょう。
その考え方は全くもって的外れな訳ではありません。
なんせ「aは変数としては宣言されていない」んですから。
実際に実行して見るとエラーは出ません。
なぜか?
Function
Test(a,c)
は考え様によっては
Function Test(Dim a,Dim
c)
と置き換える事ができるからです。
Functionは「関数」ですが、そのカッコ内に「,」で区切った名前(ここではaとc)は
Function内(Function〜End
Functionの間)においては「変数と同じ」
として扱われるからです。
(これらの変数を関数の「引数」と呼ぶのは以前書いたとおりです。)
でもここで問題が発生します。
Option
Explicit
Dim a
a =Test(10,10)
Function
Test(a,c)
a=a+10
End Function
「赤のaと青のaはどうなんの?」
ってのが今回の解説の根幹。
で、これを文章だけで説明しても理解してもらうのは非常に厳しいので、
画像を使って見たいと思います。
解説をする為にわざとミスのあるプログラムを作成しています。
まず最初に難易度★★☆☆☆のパターン。
これなんですが、
赤色の変数及び引数(a)は赤枠の範囲で、
青色の変数(b,c)は青枠の範囲で、
緑色の変数(d,e)は緑枠の範囲で使う事が出来ます。
そのため、
数式(b=b+10)の横に赤いXが記してあるのは
「ここでこの数式(変数)を利用する事はできない」という意味となります。
ただ、「Test1」での
b,cの変数は関数が終わった時(End
Function)に消滅します。
ですので、
b=b+10(と、c=c+10)は実質的に無意味という事になります。
また、Dim c
をDim a,cやDim
b,cと変えるなど
と有効範囲が重複する場所で同じ名前の変数を宣言する事はできません。
次に難易度★★★☆☆のパターン。
この場合、
TestでのaとTest外のaは「同じ名前」ですが、
この場合2つは「全く同一」とみなされます。
Result=Test(a)
でTestが呼び出され、この時点でaは0ですが
※VBSでは変数の初期値は(数字としては)常に0となっています。
Test内で、
a=a+10
を行ってaは10。
Functionが終わり、Msgboxを出した時点で、aは10なので
10がメッセージボックスに表示されます。
ちなみに、当然ですが、
Dim
a,Result
Result=Test()
Function Test()
a=a+10
End
Function
と、Testの()内に何も書いていない場合でも
Function
Test(a)
と同じ結果となります。(aはFunction内ではどっちにしても有効ですからね)
と、ここまではまだいいのですが次が問題。
難易度★★★★☆のパターン。
まずは下の画像を見て欲しい・・・
これなんですが色々と問題がそこかしこにあるんです。
何故って、これってプログラミング言語の中で恐らく最も有名な
「C言語」の「ポインタ」という概念に相当するんです。
しかもその「ポインタ」ですが
C言語で最初につまづく場所の多くが「ポインタ」
と称される事もある程の難解な部分な訳ですね困った事に。
これをHTMLで解説していると異常に長くなり
このHTMLが重くなるので今回は2回に分けようと思います。
という訳でPart2へ続く・・・12-[2]