• 締切済み

C言語:関数の返り値と引数について

C言語:関数の返り値と引数について C言語の関数を作るとき、ほしい値とかを引数にして渡す場合と、そのまま返り値で渡す場合の二種類がありますよね? 例えば、 ・void Smooth( Image *src, Image *dst, int param ); ・Image *Smooth( Image *src, int param ); みたいな感じで mallocとかは返り値で渡してますけど、opencvの関数(例えばcvSmooth)とかは引数にしてます これって使い分けとかあるんでしょうか?

みんなの回答

  • kmee
  • ベストアンサー率55% (1857/3366)
回答No.6

既にいろいろでているので、OpenCVに関して。 cvSmooth等はIn-Placeの変換(入力画像を結果を出力する)ができます。 他の(ガベージコレクション などで)自動解放する言語や、 = をオーバライドしてin-place版を実行できる言語なら src = Smooth(src) ; でもいいのですが、Cの場合、こんなことをしたら、実行前にsrcに入っていた領域が参照できなくなります。 参照できなければfreeできません。 void Smooth( Image *src, Image *dst, int param ); の型なら、 src == dst かどうかで、In-Placeかどうかを判定できます。

mist_to
質問者

お礼

なるほど 確かに、src=Smooth(src)の場合はそうなりますね 納得です ありがとうございました

すると、全ての回答が全文表示されます。
  • php504
  • ベストアンサー率42% (926/2160)
回答No.5

関数内で動的に確保する場合はポインタで受けとれますがそうでない場合はポインタ引数で受け渡しになるということです

mist_to
質問者

お礼

あぁ、なるほど そういうことですか ありがとうございました

すると、全ての回答が全文表示されます。
回答No.4

返すデータの数とか種類、意味合いとかによって様々でしょう。 (1)単独の値を返す場合  関数の返り値だけで事足ります。 (2)複数の結果を返さなければならない場合  構造体を返り値にするという方法もありますが、一般的な変数型の値が2、3個の場合は結果の格納先のポインタを貰う形の方がわかりやすいということもあります。 (3)ある程度の容量を必要とするデータを返す場合  関数内でmallocとかしてそのポインタを返すとかいう方法もありますが、返した先でメモリのサイズがわからないとか、freeし忘れがちになるとかいうことが起こるので、明示的に呼び元で領域確保した先に書き込む方が安全です。 (4)使い分け  関数の処理の成否を返り値で返し、処理結果そのものは指定のポインタ先に格納するというものもあります。  要は関数の設計しだいですが、一般的には(1)のような場合は返り値で返す方が好まれます。返り値で返した場合は関数の呼び出しそのものを分岐の評価式とすることができますが、アドレスを引数で渡すものはワンクッション置かなくてはなりません。(4)もそのような感じかな。

mist_to
質問者

お礼

なるほど… 確かに、処理の成否を返したりする場合は結構ありますね ありがとうございました

すると、全ての回答が全文表示されます。
  • f272
  • ベストアンサー率46% (8653/18507)
回答No.3

戻したい値が二つ以上ある場合には,引数にする。 戻したい値が一つの場合には,戻り値にする。 というのが基本だと思います。とはいえ,これを無視して逆のやり方をすることも可能です。 戻したい値が二つ以上ある場合でも,構造体を用意して,関数内でその構造体に代入して戻り値にする。 戻したい値が一つの場合でも,引数にして戻り値を使わない。 結局のところ,ローカルルールで決めているだけですね。

mist_to
質問者

お礼

やっぱりローカルルールで決めてるだけなんですね ありがとうございました

すると、全ての回答が全文表示されます。
  • nda23
  • ベストアンサー率54% (777/1416)
回答No.2

特に規則はないと思います。好みの問題でしょう。 mallocの結果だって、引数で返す場合もあります。 void xx(void **p) {     *p = malloc(2048); }

mist_to
質問者

お礼

まぁそれは確かにできますね やっぱり好みの問題ですか ありがとうございました

すると、全ての回答が全文表示されます。
  • php504
  • ベストアンサー率42% (926/2160)
回答No.1

私は大きな構造体の場合はポインタの引数にして受け取ります (返り値で受け取ると値のコピーが無駄なので)

mist_to
質問者

お礼

それは返り値をポインタにすればいいような… ありがとうございました

すると、全ての回答が全文表示されます。

関連するQ&A