2011-01-08 10 views
1

nach dieser vorherigen Frage Malloc Memory Corruption in C, jetzt habe ich ein anderes Problem. Ich habe den gleichen Code. Jetzt versuche ich, die in den Arrays A * vc enthaltenen Werte zu multiplizieren und in res zu speichern. Dann wird A auf Null gesetzt und ich mache eine zweite Multiplikation mit res und vc, und ich speichere die Werte in A. (A und Q sind quadratische Matrizen und mc und vc sind N Zeilen zwei Spalten Matrizen oder Arrays). Hier ist mein Code:Array Index ist keine ganze Zahl

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

Wenn ich zu kompilieren versuchen, ich habe diesen Fehler:

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 

Die entsprechenden Linien sind, wo ich die Ergebnisse in res und A speichern:

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

und

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

Kann mir jemand erklären, was dieser Fehler ist und wie kann ich ihn korrigieren? Danke für Ihre Hilfe. ;)

Antwort

3

mc ist vom Typ double. Es muss ein integraler Typ sein

1

Der Compiler klagt, weil der Ausdruck, den Sie als Array-Index verwenden, den Typ double ergibt.

Mit anderen Worten, der Ausdruck:

mc[2*kc] + i*dim 

... erhalten Sie ein Ergebnis geben, die double vom Typ ist. Vielleicht möchten Sie in die Regeln für usual arithmetic type conversions in C suchen, wenn Sie nicht verstehen, , warum dieser Ausdruck zu einem double auswertet.

Das Problem ist, dass Array-Indizes integrale Typen wie int oder long sein müssen. Dies liegt daran, dass der Array-Index-Operator in C grundsätzlich eine Kurzform für Zeigerarithmetik ist. Mit anderen Worten, sagen array[N] ist das gleiche wie sagen *(array + N). Aber Sie können Zeigerarithmetik nicht mit nicht-integralen Typen wie float oder double tun, so natürlich der Array-Subscript-Operator wird auch nicht so arbeiten.

Um dies zu beheben, müssen Sie das Ergebnis Ihres Array-Indizierungsausdrucks in einen ganzzahligen Typ umwandeln.

2

mc ist Zeiger auf doppelt.

In oben, indexieren Sie A mit einem Wert in mc (Doppel-Array). Und es gibt andere ähnliche Fälle. Wenn Sie sicher, dass die Werte sind, werfen

1

Ihre Erklärung mc int:

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

Und dann verwenden Sie mc mehrere Male in Ihrem Array-Zugriff.Zum Beispiel:

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

Können Sie mc ändern, um eine int Array anstelle eines double sein?

1

Sieht so aus, als ob Sie Einträge in mc, die doppelt sind, als Teil von Array-Indizes verwenden, wodurch der gesamte Index zu einem Double wird.

Wenn Sie dies bewerkstelligen möchten, versuchen Sie, auf eine ganze Zahl zurückzuspielen. Ich weiß nicht, was der Kontext dieses Problems ist, aber ich würde einen wirklich guten Blick darauf werfen, was Sie tun, um sicherzustellen, dass Sie wirklich den Inhalt von mc als einen Index verwenden möchten.

0

mc ist ein Array von Doppelpunkten und Fließkommawerte können nicht zum Indexieren von Arrays verwendet werden. Ich stelle fest, dass du nirgends in deinem Code etwas anderes als Integer an mc legst. Sie sollten erwägen, den Typ von mc in ein Array von ganzen Zahlen zu ändern.

Verwandte Themen