OOobbs/7
質問 毎度お世話になっています。ExcelからOOへ乗り換えようと悪戦苦闘(?)している者です。じつは、サブルーチンの挙動がおかしいと思われる所がありまして、調べてみました。結果的に型宣言が不完全だったのですが、極端に単純化しますと、下記のような状況だったんです。サブルーチンだけを見ると、変数kの計算結果は単純に2222になります。ところがkは、メインルーチンでは型宣言がないので浮動小数点短精度実数と自動的にみなされ、サブルーチンでは整数と型宣言されています。そこでMS Visual Basicでは、型の不一致でエラーが出て処置がとまります。とことがOOの場合、msgboxで11と表示されて終わります。どうやら、最初の2回だけ代入が実行され、それ以降は代入されないようです。 Sub mainmain Call subsub ( 1 , 10 , 100 , 1000 , k ) MsgBox k End End Sub Sub subsub ( a , b , c , d , k As Integer ) k = a k = k + b k = k + c k = k + d k = k * 2 End Sub 回答
と書きましたが,上記のコードをデバッグしてみると subsub 内で k は k = k + b で 11 になりその後の演算では変化しませんでした。 これは subsub 関数へ値を渡す際の挙動の違いによるもののような気がしたので,次のようにしてみました。 Sub mainmain Call subsub ( 1 , 10 , 100 , 1000 , k ) MsgBox k End End Sub Sub subsub ( a , b , c , d , ByVal k As Integer ) k = a k = k + b k = k + c k = k + d k = k * 2 End Sub このようにすると k = k + c の演算で k = 111 になります。この挙動から,「最初の2回だけ代入が実行され、それ以降は代入されないようです」というのは変数の型の違いによるものではなくて参照の違いによるものと分かります。 2 回目以降の演算も行われているのです。これは以前もあったのですが,Function や Sub への値は特に指定しない場合にはデフォルトで「参照渡し」になります。「値渡し」にするには ByVal キーワードを使用します。 ByVal キーワードを使用して変更したものでは MsgBox に値が表示されないので sub を function に変更して Sub mainmain k = subsub ( 1 , 10 , 100 , 1000 , k ) MsgBox k End End Sub Function subsub( a , b , c , d , ByVal k As Integer ) k = a k = k + b k = k + c k = k + d k = k * 2 subsub = k End Sub とするべきかもしれません。変数のスコープが違えば別ですが。 -- はにゃ?? 2004-01-30 (金) 03:12:00
|