5

簡単なデザイン (?) に関する質問があります。

私は、これらのような関数がいくつかある単純なプログラムを書いています。

float foo (float* m,size_t n){

   float result;
   //do some calculations, for example a sum 


   return result / n;
}

これについていくつか質問がありますが、聖戦を再開するつもりはありません。

に健全性チェックを追加する必要がありnますか? その場合、発信者にどのように通知すればよいですか?

float での戻り-1は奇妙に見えます。

float foo(float *m,size_t n){
     if (n == 0) return -1f

     ...
  }

私の他のオプションは out パラメータです

float foo(float *m,size_t n, int *error){

        if (n==0){
           *error = 1;
            return 0f;
        }
       ...
}

アップデート

これはおもちゃのプログラムのようなもので、何かを練習しようとしているだけです。質問はその事実を超えています。「(OOP)例外なしでエラーを処理する方法」に言い換える必要があるかもしれません。

電話をかける前にテストすることも検討しnていますが、あまり好きではありません。

何かご意見は?前もって感謝します。

4

4 に答える 4

6

out parameterあなたのオプションは良いものだと思います。でも、逆のほうがいいと思います。out パラメータを使用して結果を取得し、戻り値を呼び出しのステータスを示します。このような

int foo(float *m, size_t n, float* result)
{
  if(someFailureCondition)
    return ERROR; // ERROR being an error integer
  // else
  // do some calculation
  // set your result
  return NO_ERROR; // NO_ERROR being an integer
}

編集: 戻り値は、out パラメータの現在の状態を示すために、より詳細にすることができます。Jamesdlin のコメントを参照してください。

于 2010-09-07T04:25:21.637 に答える
2

とにかく関数によって -1 が返されない場合は、必ず -1 を返します。ただし、n=0 を渡しても関数が壊れない場合は、実際には必要ありません。n は配列 m のサイズであると仮定します。

エラーの処理は好みの問題です。OpenGL は、関数が失敗したときにエラー コード (-1 またはそれ以外) を返すことによってエラーを処理します。エラー コードは、GetLastError() (またはそのようなもの) の呼び出しによって返されます。これは理想的なエラー処理ソリューションのようです。

于 2010-09-07T04:22:18.557 に答える
1

必要に応じて使用できる特別な浮動小数点値があります。たとえば、浮動小数点の実装が quiet NaN (Not-a-Number) をサポートしている場合は、次のNANマクロを使用できmath.hます。

#include <math.h>
float foo(float *m,size_t n)
{
     if (n == 0) return NAN;

     ...
}
于 2010-09-07T04:33:57.780 に答える
1

コードを明確に文書化して、関数のセマンティクスを呼び出し元に知らせる必要があります。

あなたの機能に対する契約は何ですか?呼び出し元が に 0 を渡さないように要求されている場合はn、そのことを説明する必要があり、関数はassertこれらの要件が満たされていることを確認するために使用する必要があります。 論理エラーは早期に検出する必要があり、それらの障害は可能な限り目立つようにする必要があります。

ここで、他の開発者が使用するライブラリのコードを書いていて、人々がassert無効にしてコンパイルすることを懸念している場合は、それを常に有効なよりソフトな障害モードと組み合わせるのが合理的です:

if (n == 0)
{
    assert(0);
    return NAN; /* Or return some error code */
}
于 2010-09-07T08:32:47.883 に答える