【安定版】ActiveBasicその12【4.24】 at TECH【安定版】ActiveBasicその12【4.24】 - 暇つぶし2ch■コピペモード□スレを通常表示□オプションモード□このスレッドのURL■項目テキスト650:647 10/09/11 05:09:01 墓穴工事中に悪いんだけど>>649、wiki管理人じゃないよ。必死で煽り乙です。 '↓ここからサンプル Dim X As BytePtr 'String$関数のコピー。指定した文字列を指定回数連結した文字列が返る Function test() As String test="ABCDEFG" '戻り値の文字列設定 X=StrPtr(test) 'グローバルに戻り値へのポインタをコピーしておく End Function Sub main() Dim a As BytePtr a=calloc(10) lstrcpy(a,test()) MsgBox 0,a,"戻り値" '正常に動けば、「111111111」が表示される free(a) End Sub '↓ここからプログラム実行 main() MsgBox 0,X,"グローバル保存値" '↑サンプルここまで 行数がキツイので次レスで解説 651:647 10/09/11 05:22:10 ごめんサンプルのコメントは無視して。継ぎ接ぎの実験プログラムをまんまうpしたらコメントがバグリまくってた。 動作: 関数main()でプログラム起動。 ローカルで、戻り値をString型で返すtest()を呼び出し。 test()の戻り値のポインタを取得し、グローバル変数Xに保存。 メッセージボックスでtest()の戻り値を確認して、関数main()を終了。 main()終了し、ローカル変数が開放された後で、ローカルで呼ばれたtest()の戻り値のポインタを参照してみると・・・ ・・・ローカルのハズの戻り値が開放されておらず、"ABCDEFG"が表示される。 ちなみにtest()の戻り値をLongにして、それに伴って呼び出し部分を変更したサンプルでは、きちんと開放されている。 '↓ここからサンプル Dim X As BytePtr Function test() As Long test=100 '戻り値の設定 X=VarPtr(test) 'グローバルに戻り値へのポインタをコピーしておく End Function Sub main() MsgBox 0,Str$(test()),"戻り値" End Sub '↓ここからプログラム実行 main() Dim a As Long memcpy(VarPtr(a),X,4) 'グローバルに保存したポインタをLong変数に読み込み MsgBox 0,Str$(a),"グローバル保存値" ↑サンプルここまで 次ページ最新レス表示レスジャンプ類似スレ一覧スレッドの検索話題のニュースおまかせリストオプションしおりを挟むスレッドに書込スレッドの一覧暇つぶし2ch