プロシージャの引数の数を可変にする(ParamArray)

Function func1(ParamArray arg())
'引数の下限:LBound(arg)/上限:UBound(arg)
配列として受け取ることで任意の引数を取ることができる。
Sub main()
Dim a
a = d(1, 2, 3)
MsgBox a
a = d(1, 2, 3, 4, 5, 6, 7, 8, 9, 10)
MsgBox a
End Sub

Function d(ParamArray val())
Dim i
For i = LBound(val) To UBound(val)
d = d + val(i)
Next
End Function
引数を任意にすることができる。
プロシージャ側では複数の引数を配列として受け取る訳である。

ただし複数の引数を配列として受け取るだけであって、配列を引数群として受け取れるわけではない。
例えば
Sub main()
Dim ary(1)
ary(0) = 2
ary(1) = 10
Dim a
a = d(ary, 1, 2, 3)
MsgBox a
End Sub

Function d(ParamArray val())
Dim i
MsgBox LBound(val) & "&" & UBound(val)
MsgBox val(0)
For i = LBound(val) To UBound(val)
MsgBox val(i)
d = d + val(i)
Next
End Function
このようにしても期待通りには動かない。
Function d の中の一つ目のMsgBoxは0&3 と表示されるので配列変数を一つの変数として受け取っているに過ぎないことがわかる。
そして二つ目のMsgBoxで「型が一致しない」というエラーとなる。

ちなみにPerlでは配列が“展開”されて全部で5つの引数として処理される。
C言語ではポインタ渡しなのでそれをポインタと見なして配列で処理できる。
comments (2)

コメント

ivettemanetta.wordpress.com | 2017/07/31 04:19 PM
continuously i used to read smaller articles or
reviews which as well clear their motive, and that is
also happening with this post which I am reading here.
Why is my Achilles tendon burning? | 2017/07/29 05:29 AM
I do not even know how I ended up here, but
I thought this post was good. I don't know who you are but definitely
you're going to a famous blogger if you are not already ;) Cheers!

Comment Form