2016-03-23 9 views
1

私はclfftのサンプルコードを見ていました。私は、各関数呼び出しの後にerrに値を代入し続けていることに気づきます。このコードのエラーチェックのポイントは何ですか?

err = clfftCreateDefaultPlan(&planHandle, ctx, dim, clLengths); 

/* Set plan parameters. */ 
err = clfftSetPlanPrecision(planHandle, CLFFT_SINGLE); 
err = clfftSetLayout(planHandle, CLFFT_COMPLEX_INTERLEAVED, CLFFT_COMPLEX_INTERLEAVED); 
err = clfftSetResultLocation(planHandle, CLFFT_INPLACE); 

/* Bake the plan. */ 
err = clfftBakePlan(planHandle, 1, &queue, NULL, NULL); 

/* Execute the plan. */ 
err = clfftEnqueueTransform(planHandle, CLFFT_FORWARD, 1, &queue, 0, NULL, NULL, &bufX, NULL, NULL); 

/* Wait for calculations to be finished. */ 
err = clFinish(queue); 

/* Fetch results of calculations. */ 
err = clEnqueueReadBuffer(queue, bufX, CL_TRUE, 0, N * 2 * sizeof(*X), X, 0, NULL, NULL); 

私はエラーチェックの必要性を理解していますが、実際には戻り値をチェックすることはありません。彼らはそれをerrに割り当てて上書きします。私のコードでは、私はこれを持っています...

status = clfftSetPlanPrecision(bpm->fft_plan, bpm->float_type); 
    if(status != CLBPM_SUCCESS) 
     goto cleanup; 

    status = clfftSetLayout(bpm->fft_plan, CLFFT_COMPLEX_INTERLEAVED, CLFFT_COMPLEX_INTERLEAVED); 
    if(status != CLBPM_SUCCESS) 
     goto cleanup; 

    status = clfftSetPlanScale(bpm->fft_plan, CLFFT_FORWARD, 1.0f/(bpm->grid_size * bpm->grid_size)); 
    if(status != CLBPM_SUCCESS) 
     goto cleanup; 

    status = clfftSetPlanScale(bpm->fft_plan, CLFFT_BACKWARD, 1.0f); 
    if(status != CLBPM_SUCCESS) 
     goto cleanup; 

    status = clfftSetResultLocation(bpm->fft_plan, CLFFT_OUTOFPLACE); 
    if(status != CLBPM_SUCCESS) 
     goto cleanup; 

例のコードはちょうど悪いコードですか、それとも関数呼び出しを通して伝播するエラーですか?

+0

'err'のポスト減速度。何とか特別なの? – chux

+0

ここに完全なコードへのリンクがあります(スクロールダウン)https://github.com/clMathLibraries/clFFTエラーはcl_intタイプのものです – chasep255

+0

完全なコードではありません。 'type cl_int'の定義はそこにはありません(AFAICT)、おそらく' CL/cl.h'にあります。 OTOH、私はこの調査のラインが今では助けになるとは思わない。 – chux

答えて

2

私の推測は、怠惰なプログラマー(別名「不良コード」)です。

あなたはそうです、それぞれのエラー値を投げ捨ててチェックしません。

おそらく "ほとんどの時間"動作し、エラーパスがほとんど使用されないため、これはあまり一般的ではありません。

+0

あなたは、自分のサイトのホームページのメインの例で、このようなことをするとは思わないでしょう。 – chasep255

+0

@ chasep255真実ですが、そのような「ページ1」のサンプルコードは、ポイントを明確にするために単純化されています。通常はそれが指摘されていますが、ここでは起こっていないようです。 – unwind

+0

一連のエラーに対して| =を使用していましたが、これはこれに類似しています。 – Joshpbarron

5

私にとっては、改良可能なコードのようです。デバッグ中に実際の戻り値を見ることができるので、通常の方法で戻り値を無視するよりも優れています。特別なエラー処理が不要なあなたの例では、マクロはオプションになります:

#define ON_ERROR_GOTO_CLEANUP(status) if(status != CLBPM_SUCCESS) goto cleanup 

ON_ERROR_GOTO_CLEANUP(clfftSetPlanScale(bpm->fft_plan, CLFFT_BACKWARD, 1.0f)); 
+1

デバッグポイントは実際には非常に重要なものです。最適化をすべてオフにすると、 'err' varが存在していてEAXからロードされる可能性があります(使用されていなくても)。すべての機能を備えたリリースビルド。それはすべて削除される可能性が高いです。 –

関連する問題