投稿日 | : 2006/03/01(Wed) 17:34 |
投稿者 | : 魔界の仮面弁士 |
Eメール | : |
URL | : |
タイトル | : Re: バイト指定のString型変数での出来事 |
それは、やっちゃいけないコーディングの一つだったりします…。
# 理由としては、ISBN4-89100-455-X の 411 頁あたり
## VB.NET か VB6 かで、多少動作が変わってくるけれど。
> Call func1(str1)
VB6 の仕様上、引数に固定長文字列型は使えませんよね。可変長文字列型のみです。
そのため、String 型引数に String * ? 型の変数を渡すと、その変換のために
メモリ上に『一時的な変数のコピー』が用意され、それが渡される事になります。
しかも ByRef の場合は、プロシージャ側で変更された引数の内容が、
「変数に書き戻される」という作業が発生するため、今回の問題を引き起こします。
> Private Function func1(str2 As String) As Boolean
今回、この str2 には、モジュールレベル変数 str1 を渡していましたので、
func1 に入った直後では、それぞれの変数は
モジュール変数 str1 = "aaa "
引数 str2 = "aaa "
という状態になっています。ここまでは良いですよね。
> str1 = "bbb"
そしてこの時点で、モジュール変数 str1 は "bbb " になりますね。
では、str2 の値はどうなっているでしょうか?
ByRef の引数なので、通常であれば str2 は str1 の別名として扱われ、
両者共に "aaa " に置き換わるはずなのですが、今回は
「一時的な変数のコピー」が渡されているため、それぞれ別の変数として処理され、
モジュール変数 str1 は "bbb "
引数 str2 は "aaa "
という状態をひきおこします。
> MsgBox "func1でのstr1は" & str1
> func1 = True
> End Function
そのため、ここで問題がおきます。引数 str2 は「ByRef」として扱われていましたので、
このプロシージャを抜けた時点で、引数 str2 の内容が、str1 に書き戻されます。
そのため、func1 を呼び出した後では、str1 = "aaa " となるわけです。