Próbuję napisać oświadczenie warunkowe w moim jądrze openCl. Kod znajduje się na obrazku. Jeśli usunąłem wewnętrzne warunkowe oświadczenia, kod działa w porządku, ale w przeciwnym razie otrzymuję następujący błąd:

<program source>:157:23: warning: unused variable 'pyramid_1'
     float pyramid_1 = (largest_0 - largest_1) * distance_bw_x_coord * half_diff / 2 / 3;
           ^
<program source>:158:23: warning: unused variable 'pyramid_2'
     float pyramid_2 = (smallest_1 - smallest_0) * distance_bw_x_coord * half_diff /2 / 3;
           ^
<program source>:161:23: warning: unused variable 'pyramid_1'
     float pyramid_1 = distance_bw_x_coord * (largest_1 - smallest_1) * half_diff / 3;
           ^
<program source>:162:23: warning: unused variable 'pyramid_2'
     float pyramid_2 = half_diff * (largest_0 - smallest_1) * distance_bw_x_coord / 2 / 3;
           ^
<program source>:165:23: warning: unused variable 'pyramid_1'
     float pyramid_1 = distance_bw_x_coord * (largest_1 - largest_0) * half_diff / 3;
           ^
<program source>:166:23: warning: unused variable 'pyramid_2'
     float pyramid_2 = half_diff * (smallest_1 - smallest_0) * distance_bw_x_coord / 2 / 3;
           ^
<program source>:169:23: warning: unused variable 'pyramid_1'
     float pyramid_1 = (largest_0 - largest_1) * distance_bw_x_coord * half_diff / 2 / 3;
           ^
<program source>:170:23: warning: unused variable 'pyramid_2'
     float pyramid_2 = distance_bw_x_coord * (smallest_0 - smallest_0) * half_diff / 3;
           ^
<program source>:173:23: warning: unused variable 'pyramid_1'
     float pyramid_1 = half_diff * (largest_0 - smallest_0) * distance_bw_x_coord / 2 / 3;
           ^
<program source>:174:23: warning: unused variable 'pyramid_2'
     float pyramid_2 = distance_bw_x_coord * (largest_1 - smallest_1) * half_diff / 3;
           ^
<program source>:177:23: warning: unused variable 'pyramid_1'
     float pyramid_1 = distance_bw_x_coord * (largest_1 - largest_0) * half_diff / 3;
           ^
<program source>:178:23: warning: unused variable 'pyramid_2'
     float pyramid_2 = distance_bw_x_coord * (smallest_0 - smallest_1) * half_diff / 3;
           ^
<program source>:180:78: error: use of undeclared identifier 'pyramid_1'
     total_area += trapezoid_prism_vol + 2 (triangular_prism_vol + pyramid_1 + pyramid_2);    
                                                                   ^
<program source>:180:90: error: use of undeclared identifier 'pyramid_2'
     total_area += trapezoid_prism_vol + 2 (triangular_prism_vol + pyramid_1 + pyramid_2);    
                                                                               ^

To jest kod

1
Marina Drygala 19 styczeń 2020, 19:22

1 odpowiedź

Najlepsza odpowiedź

OpenCl wykorzystuje reguły z zakresu zakresu C. Oznacza to, że jeśli zadeklarujesz zmienną w bloku {X0}}, zmienna istnieje tylko w tym bloku.

Właściwy sposób napisania typu kodu, który próbujesz napisać to:

if (whatever)
{
    float pyramid_1; // declare the variable here
    if (condition1) {
        pyramid_1 = expression1; // assign a value here…
    }
    else if (condition2) {
    {
        pyramid_1 = expression2; // …and here…
    }
    // etc.

    /* You can use the result of computing pyramid_1's value here, as
     * we're still inside the same { } block it was declared in. */

    // …
}

Upewnij się, aby usunąć specyfikator typu float wewnątrz bloków if / else if, aby te stwierdzenia zadania . Jeśli tego nie zrobisz, po prostu ogłoszczyłeś nowe zmienne o tej samej nazwie , jak osoba zadeklarowała poza tymi blokami. (Nazywa się to cieniowaniem i zazwyczaj zły pomysł - w tym przypadku zmienna zewnętrzna nigdy nie zostałaby zaktualizowana))

2
pmdj 20 styczeń 2020, 10:44