A 回答 (6件)
- 最新から表示
- 回答順に表示
No.3
- 回答日時:
戻したい値が二つ以上ある場合には,引数にする。
戻したい値が一つの場合には,戻り値にする。
というのが基本だと思います。とはいえ,これを無視して逆のやり方をすることも可能です。
戻したい値が二つ以上ある場合でも,構造体を用意して,関数内でその構造体に代入して戻り値にする。
戻したい値が一つの場合でも,引数にして戻り値を使わない。
結局のところ,ローカルルールで決めているだけですね。
No.4
- 回答日時:
返すデータの数とか種類、意味合いとかによって様々でしょう。
(1)単独の値を返す場合
関数の返り値だけで事足ります。
(2)複数の結果を返さなければならない場合
構造体を返り値にするという方法もありますが、一般的な変数型の値が2、3個の場合は結果の格納先のポインタを貰う形の方がわかりやすいということもあります。
(3)ある程度の容量を必要とするデータを返す場合
関数内でmallocとかしてそのポインタを返すとかいう方法もありますが、返した先でメモリのサイズがわからないとか、freeし忘れがちになるとかいうことが起こるので、明示的に呼び元で領域確保した先に書き込む方が安全です。
(4)使い分け
関数の処理の成否を返り値で返し、処理結果そのものは指定のポインタ先に格納するというものもあります。
要は関数の設計しだいですが、一般的には(1)のような場合は返り値で返す方が好まれます。返り値で返した場合は関数の呼び出しそのものを分岐の評価式とすることができますが、アドレスを引数で渡すものはワンクッション置かなくてはなりません。(4)もそのような感じかな。
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かどうかを判定できます。
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- C言語・C++・C# 関数ポインタの高速化のメリット 7 2023/05/05 20:15
- C言語・C++・C# const char** p;のとき、free(p)でC4090エラーとなるのはなぜですか 3 2023/03/31 16:28
- C言語・C++・C# C言語 共用体について コマンドライン引数で値を2つ入力したときに、argv[2]の値をUNI u1 4 2022/04/25 20:34
- C言語・C++・C# c言語の問題です 課題1 (二分探索木とセット) 大きさ size の配列 array を考える。す 2 2023/01/10 21:08
- 大学・短大 C言語線形リストの問題です 3 2022/12/22 00:45
- C言語・C++・C# 至急教えてください! プログラミングの問題です! お願いします! 出力2と全く同じ出力をするように、 2 2022/06/22 23:10
- C言語・C++・C# C言語 3 2022/10/04 15:07
- C言語・C++・C# C言語の課題が出たのですが自力でやっても分かりませんでした。 要素数がnであるint型の配列v2の並 3 2022/11/19 17:41
- その他(プログラミング・Web制作) pythonのグローバル変数 2 2022/11/25 18:02
- C言語・C++・C# C言語のエラーについて 2 2022/07/11 13:56
関連するカテゴリからQ&Aを探す
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
セグメントエラー
-
init関数の意味
-
Run-Time Check Failure #3とい...
-
アプリを32bitから64bit移行
-
DLL<->VB間での受け渡し(文字...
-
C言語のポインタに直接アドレス...
-
LPSTR型の初期化について
-
参照型で受け取った引数をポイ...
-
戻り値で構造体を返すことは可...
-
構造体とfscanf
-
fopne で失敗する原因
-
NASMかNASKの文法の本
-
関数ポインタの高速化のメリット
-
自作関数の引数
-
Cで作成したDLL関数をVBから呼...
-
popenした子プロセスのプロセス...
-
#define NULL ((void *)0) の弊害
-
C言語のプログラムをJavaに...
-
visual studioのエラーについて
-
x64プログラムでアドレスが32bi...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
セグメントエラー
-
C言語のポインタに直接アドレス...
-
init関数の意味
-
戻り値で構造体を返すことは可...
-
fopne で失敗する原因
-
C言語の関数と配列に関する質問
-
Run-Time Check Failure #3とい...
-
LPSTR型の初期化について
-
ExcelVBAでのkernel32(64bit)
-
main(int argc,char **argv[])...
-
アプリを32bitから64bit移行
-
ハンドルはポインタか
-
連結リスト 要素の入れ替え
-
C言語でのconstを返す関数
-
Cで作成したDLL関数をVBから呼...
-
NULLとブランクの違い
-
エラーの意味
-
ハンドル、アドレス、ポインタ...
-
DLL<->VB間での受け渡し(文字...
-
【C言語】戻り値が構造体の関数
おすすめ情報