皆さん今日は。
バグ報告の方にすべきなのかも知れませんが、
今回は、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 共で起こります。
ByVal に関して
これ、よくある誤解なんですよね!
配列、文字列、構造体を関数に渡す際はポインター(ByRef)で渡します。内容の転送は行ないません。
ByValでポインターを渡す事はByRefと同じです。
数値型をByVal渡す際は、内容を転送するのでローカル変数を変更しても呼び出し元に影響を与えません。
(ほとんどの言語で同様に動作すると思います。)
配列、文字列、構造体を関数に渡す際はポインター(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