数组下标不是整数

时间:2011-01-08 17:26:38

标签: c arrays cuda gpu

按照上一个问题Malloc Memory Corruption in C,现在我有另一个问题。 我有相同的代码。现在我试图乘以数组A * vc中包含的值 并存储在res。然后将A设置为零,并使用res和vc进行第二次乘法,并将值存储在A中。(A和Q是方形矩阵,mc和vc是N行,两列矩阵或数组)。 这是我的代码:

    int jacobi_gpu(double A[], double Q[], 
           double tol, long int dim){
  int nrot, p, q, k, tid;
  double c, s;
  double *mc, *vc, *res;
  int i,kc;
  double vc1, vc2;

  mc   = (double *)malloc(2 * dim * sizeof(double));
  vc   = (double *)malloc(2 * dim * sizeof(double));
  vc   = (double *)malloc(dim * dim * sizeof(double));

  if( mc == NULL || vc == NULL){
    fprintf(stderr, "pb allocation matricre\n");
    exit(1);
  }

  nrot = 0;

  for(k = 0; k < dim - 1; k++){

    eye(mc, dim);
    eye(vc, dim);

    for(tid = 0; tid < floor(dim /2); tid++){
      p = (tid + k)%(dim - 1);
      if(tid != 0)
    q = (dim - tid + k - 1)%(dim - 1);
      else
    q = dim - 1;

      printf("p = %d | q = %d\n", p, q);
      if(fabs(A[p + q*dim]) > tol){

    nrot++;
    symschur2(A, dim, p, q, &c, &s);


    mc[2*tid] = p;                                               vc[2 * tid] = c;
    mc[2*tid + 1] = q;                                           vc[2*tid + 1] = -s;
    mc[2*tid + 2*(dim - 2*tid) - 2] = p;                         vc[2*tid + 2*(dim - 2*tid)   - 2 ] = s;
    mc[2*tid + 2*(dim - 2*tid) - 1] = q;                         vc[2 * tid + 2*(dim - 2*tid) - 1 ] = c;



    }
    }

    for( i = 0; i< dim; i++){
      for(kc=0; kc < dim; kc++){
    if( kc < floor(dim/2)) {
      vc1 = vc[2*kc + i*dim];
      vc2 = vc[2*kc + 2*(dim - 2*kc) - 2];
    }else {
      vc1 = vc[2*kc+1 + i*dim];
      vc2 = vc[2*kc - 2*(dim - 2*kc) - 1];
    }
    res[kc + i*dim] = A[mc[2*kc] + i*dim]*vc1 + A[mc[2*kc + 1] + i*dim]*vc2;
      }
    }

    zero(A, dim);

    for( i = 0; i< dim; i++){
      for(kc=0; kc < dim; k++){
    if( k < floor(dim/2)){
      vc1 = vc[2*kc + i*dim];
      vc2 = vc[2*kc + 2*(dim - 2*kc) - 2];
    }else {
      vc1 = vc[2*kc+1 + i*dim];
      vc2 = vc[2*kc - 2*(dim - 2*kc) - 1];
    }
    A[kc + i*dim] = res[mc[2*kc] + i*dim]*vc1 + res[mc[2*kc + 1] + i*dim]*vc2;
      }
    }


    affiche(mc,dim,2,"Matrice creuse");
    affiche(vc,dim,2,"Valeur creuse");

  }

  free(mc);
  free(vc);
  free(res);
  return nrot;
}

当我尝试编译时,我有这个错误:

    jacobi_gpu.c: In function ‘jacobi_gpu’:
jacobi_gpu.c:103: error: array subscript is not an integer
jacobi_gpu.c:103: error: array subscript is not an integer
jacobi_gpu.c:118: error: array subscript is not an integer
jacobi_gpu.c:118: error: array subscript is not an integer
make: *** [jacobi_gpu.o] Erreur 1

相应的行是我将结果存储在res和A:

中的位置
res[kc + i*dim] = A[mc[2*kc] + i*dim]*vc1 + A[mc[2*kc + 1] + i*dim]*vc2;

A[kc + i*dim] = res[mc[2*kc] + i*dim]*vc1 + res[mc[2*kc + 1] + i*dim]*vc2;

有人可以解释一下这个错误是什么,我该如何纠正? 谢谢你的帮助。 ;)

6 个答案:

答案 0 :(得分:3)

mc的类型为double。它必须是整数类型

答案 1 :(得分:2)

mc是指向double的指针。

A[mc[2*kc + 1]

在上面,您使用mc(双数组)中的值索引A.而且,还有其他类似的情况。如果您确定值,则转换为int

答案 2 :(得分:1)

编译器抱怨,因为用作数组索引的表达式求值为double

换句话说,表达式:

mc[2*kc] + i*dim

...会给你一个double类型的结果。如果您不理解为什么此表达式的评估结果为double,您可能需要查看C中usual arithmetic type conversions的规则。

问题是数组索引必须是整数类型,如intlong。这是因为C中的数组下标运算符基本上是指针运算的简写。换句话说,说array[N]与说*(array + N)相同。但是你不能用非整数类型如floatdouble进行指针运算,所以当然数组下标运算符也不会这样。

要解决此问题,您需要将数组索引表达式的结果转换为整数类型。

答案 3 :(得分:1)

您对mc的声明:

mc   = (double *)malloc(2 * dim * sizeof(double));

然后在阵列访问中多次使用mc。例如:

A[mc[2*kc + 1] ...]

您可以将mc更改为int数组而不是double吗?

答案 4 :(得分:1)

看起来你正在使用mc中的条目,它们是双打的,作为数组下标的一部分,从而使整个下标成为双倍。

如果您打算这样做,请尝试强制转换为整数。我不知道这个问题的背景是什么,但是我会好好看看你正在做什么来确保你真的想要使用mc的内容作为下标。

答案 5 :(得分:0)

mc是双精度数组,浮点值不能用于索引数组。我注意到你的代码中没有任何地方可以将除整数以外的任何东西分配给mc。您应该考虑将mc的类型更改为整数数组。