ByVal に関して

ActiveBasicでのプログラミングでわからないこと、困ったことなどがあったら、ここで質問してみましょう(質問を行う場合は、過去ログやWeb上であらかじめ問題を整理するようにしましょう☆)。
返信する
メッセージ
作成者
彦左衛門

ByVal に関して

#1 投稿記事 by 彦左衛門 »

皆さん今日は。
バグ報告の方にすべきなのかも知れませんが、
今回は、ByVal に関して伺いたいと思います。
以下のようなプログラムが在るとします。

----- ここから -----

Dim TestBP As BytePtr
Dim Ret As BytePtr


TestBP = calloc(64) ' いい加減
lstrcpy(TestBP, "ActivBasicByValFunction_Test")
Ret = Check_A(TestBP)
free(TestBP)
Debug ' No.2 ← ← ←

End


Function Check_A(ByVal FunTestBP As BytePtr) As BytePtr

FunTestBP[10] = 0
Debug ' No.1 ← ← ←
Check_A = FunTestBP

End Function

----- ここまで -----


プロシージャ Check_A に、ActivBasicByValFunction_Test と言う文字列を保持するグローバル変数 TestBP という BytePtr 型変数を値参照し、ActivBasicByValFunction_Test と言う文字列を ActivBasic という文字列にして戻すと言うものですが、No.1 の所でデバッグし、確認すると、ローカル変数 FunTestBP(グローバル変数 Ret) だけで無く、グローバル変数 TestBP の値も ActivBasic という文字列に成ってしまいます。ByVal を指定したので、TestBP は最後まで ActivBasicByValFunction_Test と言う文字列を保持すべきだと思っているのですが、如何なものでしょうか。また、No.2 の所では、TestBP と共に Ret も解放されるようです。プログラミングの仕方、考え方の部分で誤りが在るのかも知れませんが、その辺りを含め、宜しくお願いします。尚、この事象は Ver3.13、Ver4.11.03 共で起こります。
マティ
記事: 161
登録日時: 2005年8月23日(火) 00:15
お住まい: 沖縄県
連絡する:

#2 投稿記事 by マティ »

これ、よくある誤解なんですよね!
配列、文字列、構造体を関数に渡す際はポインター(ByRef)で渡します。内容の転送は行ないません。
ByValでポインターを渡す事はByRefと同じです。
数値型をByVal渡す際は、内容を転送するのでローカル変数を変更しても呼び出し元に影響を与えません。
(ほとんどの言語で同様に動作すると思います。)
彦左衛門 さんが書きました: TestBP = calloc(64) ' いい加減
'' TestBP = MemoryAddress

lstrcpy(TestBP, "ActivBasicByValFunction_Test")

Ret = Check_A(TestBP)
'' 渡すのは、TestBPのMemoryAddress


free(TestBP)
Debug ' No.2 ← ← ←

End


Function Check_A(ByVal FunTestBP As BytePtr) As BytePtr
'' FunTestBPとTestBPは同じMemoryAddress

FunTestBP[10] = 0
Debug ' No.1 ← ← ←
Check_A = FunTestBP
'' 返すアドレスは、TestBPと同じMemoryAddress
End Function
彦左衛門

#3 投稿記事 by 彦左衛門 »

>マティさん
分かりやすい説明有難う御座いました。理解出来ました。
返信する