El subíndice de matriz no es un número entero

siguiendo esta pregunta anterior Corrupción de la memoria de Malloc en C, ahora tengo otro problema. Tengo el mismo código. Ahora estoy tratando de multiplicar los valores contenidos en las matrices A * vc y almacenarlos en res. Luego, A se establece en cero y hago una segunda multiplicación con res y vc y almaceno los valores en A. (A y Q son matrices cuadradas y mc y vc son N líneas, dos columnas, matrices o matrices). Aquí está mi código:

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

Cuando intento compilar, tengo este error:

    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

Las líneas correspondientes son donde almaceno los resultados en res y A:

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

y

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

¿Alguien puede explicarme qué es este error y cómo puedo corregirlo? Gracias por tu ayuda. ;)

preguntado el 08 de enero de 11 a las 17:01

6 Respuestas

mc es de tipo double. Tiene que ser de tipo integral

Respondido 21 Oct 13, 03:10

mc apunta a doblar.

A[mc[2*kc + 1]

En lo anterior, está indexando A con un valor en mc (matriz doble). Y hay otros casos similares. Si está seguro de los valores, conviértalo en int

Respondido el 08 de enero de 11 a las 20:01

Tu declaración de mc:

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

Y luego usas mc varias veces en su acceso a la matriz. Por ejemplo:

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

Puedes cambiar mc ser un int matriz en lugar de una double?

Respondido el 08 de enero de 11 a las 20:01

Parece que estás usando entradas en mc, que son dobles, como parte de subíndices de matriz, por lo que todo el subíndice es un doble.

Si pretendía hacer esto, intente volver a convertirlo en un número entero. No sé cuál es el contexto de este problema, pero echaría un buen vistazo a lo que estás haciendo para asegurarme de que realmente quieres usar el contenido de mc como subíndice.

Respondido el 08 de enero de 11 a las 20:01

El compilador se queja porque la expresión que usa como índice de matriz se evalúa como tipo double.

En otras palabras, la expresión:

mc[2*kc] + i*dim

... te dará un resultado que es de tipo double. Es posible que desee consultar las reglas para conversiones de tipo aritmético habituales en C si no entiendes ¿ por qué esta expresión se evalúa como un double.

El problema es que los índices de matriz deben ser tipos integrales, como int or long. Esto se debe a que el operador de subíndice de matriz en C es básicamente una forma abreviada de aritmética de punteros. En otras palabras, diciendo array[N] es lo mismo que decir *(array + N). Pero no puede hacer aritmética de punteros con tipos no integrales como float or double, por lo que, por supuesto, el operador de subíndice de matriz tampoco funcionará de esa manera.

Para solucionar este problema, deberá convertir el resultado de su expresión de indexación de matriz a un tipo integral.

Respondido el 08 de enero de 11 a las 21:01

mc es una matriz de dobles y los valores de punto flotante no se pueden usar para indexar matrices. Noto que en ninguna parte de su código asigna nada más que números enteros a mc. Debería considerar cambiar el tipo de mc a una matriz de enteros.

Respondido el 08 de enero de 11 a las 22:01

No es la respuesta que estás buscando? Examinar otras preguntas etiquetadas or haz tu propia pregunta.