VB6.0用掲示板の過去のログ(No.2)−VBレスキュー(花ちゃん)
[記事リスト] [新規投稿] [新着記事] [ワード検索] [管理用]

投稿日: 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       " となるわけです。


- 関連一覧ツリー (★ をクリックするとツリー全体を一括表示します)

- 返信フォーム (この記事に返信する場合は下記フォームから投稿して下さい)

- VBレスキュー(花ちゃん) - - Web Forum -