C ++ - Попытка приравнять значения двух точек приводит к ошибке: выражение должно иметь арифметический или перечислимый тип - PullRequest
0 голосов
/ 26 апреля 2019

Когда я пытаюсь скомпилировать мой файл .cu, используя nvcc -c, возникает следующая ошибка:

mag_cuda.cu (213): ошибка: выражение должно иметь арифметический или перечислимый тип

Рассматриваемая строка, если часть функции, которая будет выполняться графическим процессором, приведена здесь:

__global__// all kernels are preceded by __global__ keyword
  void sum_all_indv_B(int No_poles, double *B_x, double *B_y, double 
*B_z, double *indv_B[][3])
  {
    // determine thread ID within block
    int index = blockIdx.x * blockDim.x + threadIdx.x;

    // determine stride of loop (more elements in array than threads)
    int stride = blockDim.x * gridDim.x;

    //loop over all the poles
    for(int counter_1 = index; counter_1 < No_poles; counter_1+=stride)
      {
    //sum the B field contribution from all poles in x,y and z directions
    B_x += indv_B[counter_1][0];
    B_y += indv_B[counter_1][1];
    B_z += indv_B[counter_1][2];

        //Divide total by number of Poles
    B_x = B_x/No_poles;
    B_y = B_y/No_poles;
    B_z = B_z/No_poles;
      }
  }

Ошибка возникает при "B_x + = indv_B [counter_1] [0];", "B_x = B_x / No_poles;"и подобные линии.

Любые идеи, так как я не слишком разбираюсь в своих указателях

1 Ответ

1 голос
/ 26 апреля 2019

B_x и indv_B[i][j] являются указателями на значения double. Предполагая, что объявления double *B_x и double *indv_B[][3] являются правильными, используйте *B_x += *indv_B[counter_1][0];.

Вам также придется изменить строки ниже: *B_x = *B_x/No_poles;.

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