1

疑問があります。関数呼び出しの前に、lowとhighのいくつかの配列が割り当てられているかどうかをテストしたいと思います。関数は次のテストから始まります。

bool myMgr::compute(myInput *solvInput, double* low, double* high)
{
   if(high==NULL||low==NULL)
        return false;

   //...
}

私は何かをテストしていますか、それを正しくテストしていますか?

ありがとう、よろしく

4

5 に答える 5

1

2 つのポインターが NULL でないかどうかをテストしています。これは、ヒープ アロケーターが十分なメモリを割り当てることができなかった場合に返すものですが、それ以上の他の仮定を行うことはできません。

  • それらは可能ですが!= NULL、ユーザーによって初期化されます: double* ptr = (double*)5;
  • それらは「配列」である可能性も、まったくない可能性もあります。割り当てられた要素の数に関する情報はありません。
于 2012-07-10T10:18:17.717 に答える
1

あなたは割り当てに言及しています。それは誤解を招きます。通常のアロケーターはnull ポインターを返しません。十分なメモリがない場合、std::bad_alloc例外が発生します。

このようなポインターの使用は、ある種のオプションの動作を提供する場合に役立ちます。クライアント コードは、提供する機能が必要ないことを示すために null ポインターを渡すことができます。(もちろん、クライアント コード自体がテストを実行し、2 つのポインターが null でない場合にのみ関数を呼び出すこともできます。どちらのソリューションが望ましいかは、コンテキストに大きく依存します。)

于 2012-07-10T10:35:57.067 に答える
0

最近のバージョンの c++ (c++11 以降) を使用している場合は、nullptr代わりにNULL次を使用する必要があります。

if(high==nullptr || low==nullptr)

また、ポインターがnullptrではなく に設定されていることを確認する必要がありますNULL

が利用できない場合nullptrは、あなたがしていることは問題ありません。代わりに、SingerOfTheFallが彼のコメントに書いたように行うこともできます。

また、配列を使用してポインターに依存する代わりに、 user を使用できますstd::vector。これにより、現在のサイズなど、配列の現在の状態に関する詳細情報を取得できます。

于 2012-07-10T10:23:12.463 に答える
0

ポインターが有効なものを指しているかどうかを確認することはできません。

代わりに、配列を参照として渡すことができます。これにより、関数は少なくとも初期化された引数を確実に受け取ることができますが、最良の方法はベクトルを使用することです。

compute(std::vector<myInput> &solvInput, std::vector<double> &low, std::vector<double> &high)

または、お互いに 1:1 の場合は、クラスの低と高を配置することをお勧めします。

compute(std::vector<myInput> &solvInput, std::vector<minmax> &lowhigh)
于 2012-07-10T10:23:29.597 に答える
0

はい、あなたのしていることは正しいです。ただし、(呼び出しメソッドで) 宣言中にポインターを NULL に初期化したことを確認する必要があります。そうしないと、このテストをすり抜けるジャンク値が含まれる可能性があります。

于 2012-07-10T10:18:50.257 に答える