自作関数の返り値がおかしい

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

自作関数の返り値がおかしい

#1 投稿記事 by NON »

「指定した文字列まで切り取る」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
イグトランス
記事: 899
登録日時: 2005年5月31日(火) 17:59
お住まい: 東京都
連絡する:

#2 投稿記事 by イグトランス »

> b="abcde"'切り取る対象の文字列
> c="c"'切り取る部分の文字
おそらくこれですね。
ダブルクォーテーションで括った文字列リテラルはそれ自体アドレスを持っています。
つまりポインタ型に対して文字列を代入するとその文字列自体へのポインタが代入されます。
つまり次のようにlstrcpyを使ってみてください。

コード: 全て選択

lstrcpy(a, "abcde")
lstrcpy(c, "c")
また,関数は戻り値がどうなるかを全く知ることができません。
つまりWordCut関数は戻り値がcallocでメモリの確保されている変数だと言うことがわからないと言うことです。
つまりb=calloc(5)は無駄です。
もしWordCut関数もNONさんが作ったDLLならcに対してcallocを行うのではなく,
たとえばWordCut関数内部でcallocを行うという方法が考えられます。
NON

関数側に問題がありました

#3 投稿記事 by NON »

ご教授いただいたコードで試していたところ、
関数側でも「BytePtrに代入」している(返り値を指定する部分です)
ことに気づき、関数側に「lstrcpy(WordCut, 内容) 」とコーティングしたところ、正常に返ってくるようになりました。
BytePtr型への代入方法など勉強になりました。ありがとうございました。
返信する