ab.com コミュニティ

ActiveBasicを通したコミュニケーション
現在時刻 - 2024年4月28日(日) 03:52

全ての表示時間は UTC+09:00 です




新しいトピックを投稿する  トピックへ返信する  [ 3 件の記事 ] 
作成者 メッセージ
 記事の件名: ByVal に関して
投稿記事Posted: 2005年11月30日(水) 16:45 
皆さん今日は。
バグ報告の方にすべきなのかも知れませんが、
今回は、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 共で起こります。


通報する
ページトップ
   
 記事の件名:
投稿記事Posted: 2005年11月30日(水) 17:13 
オフライン

登録日時: 2005年8月23日(火) 00:15
記事: 161
お住まい: 沖縄県
これ、よくある誤解なんですよね!
配列、文字列、構造体を関数に渡す際はポインター(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


通報する
ページトップ
 記事の件名:
投稿記事Posted: 2005年12月01日(木) 15:18 
>マティさん
分かりやすい説明有難う御座いました。理解出来ました。


通報する
ページトップ
   
期間内表示:  ソート  
新しいトピックを投稿する  トピックへ返信する  [ 3 件の記事 ] 

全ての表示時間は UTC+09:00 です


オンラインデータ

このフォーラムを閲覧中のユーザー: なし & ゲスト[17人]


トピック投稿:  可
返信投稿:  可
記事編集: 不可
記事削除: 不可
ファイル添付: 不可

検索:
ページ移動:  
Powered by phpBB® Forum Software © phpBB Limited
Japanese translation principally by ocean