OpenCL: ошибка при использовании необъявленного идентификатора - PullRequest
1 голос
/ 19 января 2020

Я пытаюсь написать условное утверждение в моем ядре opencl. Код на картинке. Если я удаляю внутренние условные операторы, код работает нормально, но в противном случае я получаю следующую ошибку:

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

Это код

1 Ответ

2 голосов
/ 20 января 2020

OpenCL использует C правила области видимости. Это означает, что если вы объявляете переменную внутри блока { ... }, переменная существует только в этом блоке.

Таким образом, правильный способ написать тип кода, который вы пытаетесь написать:

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. */

    // …
}

Обязательно удалите спецификатор типа float внутри ваших блоков if / else if, чтобы эти операторы назначений . Если вы этого не сделаете, вы просто объявите новые переменные с тем же именем , которое было объявлено вне этих блоков. (Это называется затенением и обычно плохой идеей - в этом случае внешняя переменная никогда не будет обновлена.)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...