ページ 11

関数の戻り値で指定されているreturn-1について

Posted: 2011年3月06日(日) 14:54
by シャイニング生ごみ
ここで質問させて頂くのも三回目になりましたシャイニング生ごみと申します。
使用環境はVC++2008,Dxlibrary使用です。

今回お聞きしたいことは関数のエラーチェックで使用されるreturn-1という戻り値についてなのですが、私は今までエラーチェック等を考えておらず、関数はほぼ戻り値voidで宣言していました。そして今になってコード量が増えてきたことに危機感を覚えエラーチェックを行おうと思ったのですが、どういう関数に戻り値に-1等の失敗を知らせる機能をつければ良いのでしょうか。基本的にDxlibraryの関数はほぼ全部?に失敗したら-1を返し、成功なら0を返すという仕組みになっていたので私の自作関数もそうするべきなのだろうかと迷っている次第です。もしよろしければご助力お願いします。

Re: 関数の戻り値で指定されているreturn-1について

Posted: 2011年3月06日(日) 15:51
by へろりくしょん
これはちょっと、非常に難しい問題です。 これと言った正解は無いと思いますよ。

エラーチェックを行いたいと言う事ですから、これは成功の可否を見た方がいいかな。 と思う関数に戻り値を与えればいいのではないかと。
DXライブラリのように、DrawLine() 関数のようなものにまで成功・失敗を問うのに、どれほどの意味があるのかと考えたらちょっと疑問ですね。

まぁ、あって困るものでもありませんし、DXライブラリのような巨大で不特定多数の人が使うようなライブラリの場合は、念のために持っておいてもいいでしょうね。

すごく乱暴ですが、ぶっちゃけ好きにしたらいいと思いますよ。

ちなみに個人的には、失敗時には0、成功時には0以外を返す方が好きです。


追記です。
難しい問題だと言うのは、個人のスタンスやポリシーに大きく左右される問題だと言う事です。
一般的にこうするべきだ。 というお作法はありません。

ですから、先人の意見に従いそのルールに則るのもいいですが、こういうのはやっぱり自分で考えて書いてみて、問題が出たら考え直して、
試行錯誤しながら自分のスタイルを確立していくのが一番いいのではないかと思います。

結果的には、やっぱり好きにしたらいいと思いますよ。

Re: 関数の戻り値で指定されているreturn-1について

Posted: 2011年3月06日(日) 15:53
by softya(ソフト屋)
ライブラリは役目としてエラーを返す(呼び出し元がエラー時の処理決定するため)のがセオリーです。
それに対して使う側は、エラー時にどうするのかは方針を決めておく必要があります。

個人のソフトウェアなら詳細なエラー情報を表示して、その場所で止まったほうが便利な場合が多いんじゃないでしょうか?
バグがあってもすぐ調べることが出来ますよね。
エラーを戻り値で返しても、何処でエラーがあったか分からなかったらエラー情報の意味がありませんよ。

[追記]
へろりさんも書かれているとおり、実際のところエラー処理は難しい問題です。
私としては戻り値とか凝ったことを考えるより、エラー値を検出したらエラー情報を出してすぐ止まってくれたほうがエラーを調べるは簡単になります。
このエラー情報を出すのも実に工夫のいることなんですけどね。

Re: 関数の戻り値で指定されているreturn-1について

Posted: 2011年3月06日(日) 16:18
by シャイニング生ごみ
へろりさん、softya(ソフト屋)さん素早い回答をありがとうございます。
へろりさんの仰るとおり少し偉大な先人の方々の法則を忠実に守ろうとしすぎたのかもしれません。色々試行錯誤していきたいと思います。これからはしばらくsoftya(ソフト屋)さんの御指摘のようにif等で例外処理時にprintfDxで「不正な○○です」などを出力するようにしようかと思います。今一度見直してみると確かに戻り値などで格好をつけずとも例外処理時にメッセージを出力のほうが分かりやすいですね。お二方とも質問に答えて頂きありがとうございました。

Re: 関数の戻り値で指定されているreturn-1について

Posted: 2011年3月06日(日) 17:54
by box
へろり さんが書きました: ちなみに個人的には、失敗時には0、成功時には0以外を返す方が好きです。
個人的には、真逆ですね。
理由は、stdlib.hかどこかで定義している
EXIT_SUCCESSが0
EXIT_FAILUREが0以外
だからです。
C言語の標準とご自分の標準とをそろえる方が、混乱が少ないのではないかなぁ、なんてね。

Re: 関数の戻り値で指定されているreturn-1について

Posted: 2011年3月07日(月) 10:25
by へろりくしょん
box さんが書きました:EXIT_SUCCESSが0
EXIT_FAILUREが0以外
だからです。
私も main() 関数の正常終了時には 0 を返しますよ。 一般的にそれがルールだからです。
ただ元来、マクロ EXIT_SUCCESS EXIT_FAILURE は、exit() 関数の実引数であり、main() 関数の戻り値に使われるマクロです。
また、規格上 exit(EXIT_SUCCESS); と exit(0); の2つのコードは等価であると規定されていますが、EXIT_SUCCESS の値にまで言及はしていません。

ですから、自作関数から EXIT_SUCCESS EXIT_FAILURE を返す。 という意味でおっしゃっているのであれば、これはちょっとどうかと思いますよ。
box さんが書きました:C言語の標準とご自分の標準とをそろえる方が、混乱が少ないのではないかなぁ、なんてね。
確かに、C言語の標準関数の多くが、成功時に0、失敗時に非0を返すのは事実ですが、Windows API 等戻り値に bool 型を持つ関数などは、成功時に true 失敗時に false を返します。
こういうのはやはり、プロジェクトやライブラリ単位で統一されている事が重要だと思います。

また、私が失敗時に0を返す事を好む理由の1つに、失敗時に NULL を返す関数の存在があります。
失敗時に0を返す場合、if(!hoge()) と書けますね。 同じように失敗時に NULL を返す関数が失敗した時も、if(!strstr(buf, str)) と一貫した書式で書けます。

Re: 関数の戻り値で指定されているreturn-1について

Posted: 2011年3月07日(月) 11:31
by softya(ソフト屋)
ここら辺は行き過ぎると宗教論争になりますよね。
私は統一性があって、無駄に戻り値を戻していないほうが好みです。
せっかく戻り値を戻しても戻り値をチェックしないコードが書かれるぐらいなら、問題が出た時点でassert()しているプログラムのほうがよっぽど良いと思っています。
こう言うのは仕事場でも論争になるんで、統一するのは非常に難しいですよね。