第8講 プロシージャ(2)
第1話 VBの魔法!
VBでは変数そのものすなわち箱そのものは渡すことが出来ません。
プロシージャ内で宣言した変数のスコープ(適用範囲)はプロシージャ内に限定されているからです。
引数で渡していたのは、箱そのものではなくあくまで箱の中身である値です。
ですが、仕事を依頼したプロシージャに、
箱の中身を変更してもらいたいときがあります。
箱を渡していないのに、
箱の中身を変えるなんてこと出来るのでしょうか。
配列は添え字付き変数でした。
Dim a(n) As Integer
と宣言すると、n + 1 個の変数が用意されるのでした。
添え字は0から始まるので、nより1つ多くなるのでした。
n + 1 を配列の要素数といいます。
Dim a(0) As Integer
と宣言すれば、要素数1の配列ですから、実質『変数を宣言した=箱を用意した』のと同じです。
ところで、箱そのものは渡せないのに、
箱の中身を変えてもらう魔法にような方法があるのでしょうか。
それがあるんです。
実際にやってみましょう。
Module Module1
Sub Main() '私は社長だ。
Dim a(0) As Integer '配列を宣言したが箱が1個しか用意されていないので変数を宣言したのと同じ
a(0) = 3
Console.WriteLine("a(0)={0:d}", a(0))
f (a)
Console.WriteLine("a(0)={0:d}", a(0))
End Sub
Sub f(x() As Integer)
x(0) = 5
End Sub
End Module
実行画面
a(0)=3
a(0)=5
『なんだ!?結局
f (a)
で箱を渡しているではないか?』
と思いになるかもしれませんが、
第5講第8話のコードを少し変えて、
Module Module1
Sub Main() '私は社長だ。
Dim a As Integer '変数aの宣言
a = 3
Console.WriteLine("a = {0:d}", a)
f(a)
Console.WriteLine("a = {0:d}", a)
End Sub
Sub f(x As Integer)
x = 5
End Sub
End Module
とすると実行結果は
a = 3
a = 3
です。
箱そのものは決して渡せないのです。
2つのコードの主要部分を並べてみると、
Sub Main() '私は社長だ。
Dim a(0) As Integer '配列を宣言したが箱が1個しか用意されていないので変数を宣言したのと同じ
a(0) = 3
Console.WriteLine("a(0)={0:d}", a(0))
f (a)
Console.WriteLine("a(0)={0:d}", a(0))
End Sub
Sub f(x() As Integer)
x(0) = 5
End Sub
Sub Main() '私は社長だ。
Dim a As Integer '変数aの宣言
a = 3
Console.WriteLine("a = {0:d}", a)
f(a)
Console.WriteLine("a = {0:d}", a)
End Sub
Sub f(x As Integer)
x = 5
End Sub
と大変そっくりですが、結果は異なっています。
下のコードが箱そのもの=変数そのものを渡すことが出来ないことを示しています。
上のコードでも決して箱そのものは渡していません。
でも、
a(0)=3
a(0)=5
です。
いったいどういうことなんでしょうか。