「指定した文字列まで切り取る」DLLを作っていて、関数内部では処理が正常に行われているのに、返り値にすると変なデータが返ってきてしまいます。
'以下呼び出し部分のソース
dim a as BytePtr
dim b as BytePtr
dim c as BytePtr
a=calloc(5)
b=calloc(5)
c=calloc(5)
b="abcde"'切り取る対象の文字列
c="c"'切り取る部分の文字
a=WordCut(b,c)'BytePtr型で返ってきます。本当なら「ab」となるはずなのですが・・・
msgbox 0,MakeStr(a)
end
自作関数の返り値がおかしい
> b="abcde"'切り取る対象の文字列
> c="c"'切り取る部分の文字
おそらくこれですね。
ダブルクォーテーションで括った文字列リテラルはそれ自体アドレスを持っています。
つまりポインタ型に対して文字列を代入するとその文字列自体へのポインタが代入されます。
つまり次のようにlstrcpyを使ってみてください。
また,関数は戻り値がどうなるかを全く知ることができません。
つまりWordCut関数は戻り値がcallocでメモリの確保されている変数だと言うことがわからないと言うことです。
つまりb=calloc(5)は無駄です。
もしWordCut関数もNONさんが作ったDLLならcに対してcallocを行うのではなく,
たとえばWordCut関数内部でcallocを行うという方法が考えられます。
> c="c"'切り取る部分の文字
おそらくこれですね。
ダブルクォーテーションで括った文字列リテラルはそれ自体アドレスを持っています。
つまりポインタ型に対して文字列を代入するとその文字列自体へのポインタが代入されます。
つまり次のようにlstrcpyを使ってみてください。
コード: 全て選択
lstrcpy(a, "abcde")
lstrcpy(c, "c")
つまりWordCut関数は戻り値がcallocでメモリの確保されている変数だと言うことがわからないと言うことです。
つまりb=calloc(5)は無駄です。
もしWordCut関数もNONさんが作ったDLLならcに対してcallocを行うのではなく,
たとえばWordCut関数内部でcallocを行うという方法が考えられます。
関数側に問題がありました
ご教授いただいたコードで試していたところ、
関数側でも「BytePtrに代入」している(返り値を指定する部分です)
ことに気づき、関数側に「lstrcpy(WordCut, 内容) 」とコーティングしたところ、正常に返ってくるようになりました。
BytePtr型への代入方法など勉強になりました。ありがとうございました。
関数側でも「BytePtrに代入」している(返り値を指定する部分です)
ことに気づき、関数側に「lstrcpy(WordCut, 内容) 」とコーティングしたところ、正常に返ってくるようになりました。
BytePtr型への代入方法など勉強になりました。ありがとうございました。