2016-03-23 19 views
1

Clfft örnek koduna bakıyordum. Her bir fonksiyon çağrısından sonra err için bir değer atamaya devam ettiklerini fark ettim.Bu kodda hata denetimi nedir?

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); 

Hata denetimi gereksinimini anlıyorum, ancak aslında hiçbir zaman dönüş değerini kontrol etmiyorlar. Onlar sadece hataya atar ve üzerine yazarlar. Bunu alabilir kodumu ...

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; 

yılında örnek kod sadece kötü şifre mi yoksa işlev çağrıları ile yayılmakta hatadır?

+0

Post erteleme yavaşlaması. Bir şekilde özel mi? – chux

+0

Tam kodun linki aşağıdadır (aşağıya doğru ilerleyin) https://github.com/clMathLibraries/clFFT err sadece cl_int – chasep255

+0

değil Tam bir kod. "Cl_int" türünün tanımı yok (AFAICT), belki de "CL/cl.h". OTOH, bu soruşturma hattının şu an için yardım etmesini beklemiyorum. – chux

cevap

2

Tahminimce: tembel bir programcı (aka "bad code").

Haklısınız, her hata değerini atıyor ve kontrol etmiyor.

Bu çok nadir değildir, çünkü muhtemelen "çoğu zaman" çalışır ve hata yolları nadiren kullanılır.

+0

Sadece sitelerinin ana sayfasındaki ana örnekte böyle bir şey yapmalarını beklemezsiniz. – chasep255

+0

@ chasep255 Doğru, ancak çoğu zaman bu tür "sayfa bir" örnek kod, noktayı daha net hale getirmek için basitleştirilmiştir. Genelde, bu, burada gerçekleşmiş gibi gözüküyor. – unwind

+0

Eskiden bu tür bir değişiklik gibi görünen bir dizi hata için | = kullanılırdı. – Joshpbarron

5

Benim için geliştirilebilir kod gibi görünüyor. Geri dönüş değerini, normal şekilde görmezden daha iyidir, çünkü hata ayıklama sırasında gerçek dönüş değerini görebilirsiniz. Özel bir hata işleminin gerekmediği örneğinizde, bir makro daha iyi okunabilirlik için bir seçenek olabilir:

#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

Hata ayıklama noktası aslında çok önemlidir. Optimizasyon tümüyle kapalıyken, 'err' var muhtemelen kullanılmalı ve kullanılmasa bile, EAX'ten (veya her neyse) yüklenecektir. Tüm opti ile bir sürüm inşa. Açık, muhtemelen kaldırılır. –

İlgili konular