2016-05-04 18 views
5

ho il seguente codice:Problemi con const in C, quando con typedef e la matrice

typedef float vec3_t[3]; 

void f(const vec3_t v[2]){ 
    // do stuff 
} 

int main(int argc, char * argv[]){ 
    vec3_t v[2]; 
    v[2][1] = 1; 
    f(v); 
    return 0; 
} 

che non verrà compilato utilizzando

gcc main.c -std=gnu99 -O0 -o main 

ma dare l'errore

main.c: In function ‘main’:' 
main.c:293:5: warning: passing argument 1 of ‘f’ from incompatible pointer type [enabled by default] 
    f(v); 
    ^
main.c:286:6: note: expected ‘const float (*)[3]’ but argument is of type ‘float (*)[3]’ 
void f(const vec3_t v[2]){ 
    ^

Se D'altra parte rimuovo il requisito const nella funzione f. Funziona tutto bene. Non riesco a capire cosa c'è che non va ??

+0

Consulta anche: http://stackoverflow.com/questions/28062095/pass-a-two-dimensional-array-to-a-function-of-constant-parameter –

+0

Come accennato nel mio link vittima, questo è probabilmente un difetto nel sistema di tipo C. Penso che questo evidenzi il motivo per cui nascondere i puntatori o gli array dietro "typedef" non è una buona idea. – user694733

+0

Non è un duplicato esatto, perché la domanda collegata riguardava i puntatori degli array. In questo caso ci sono array 2D. La risposta sarà praticamente la stessa però. – Lundin

risposta

0

Perché non trasmettere il parametro a const?

typedef float vec3_t[3]; 

void f(const vec3_t v[2]){ 
    // do stuff 
} 

int main(int argc, char * argv[]){ 
    vec3_t v[2]; 
    v[2][1] = 1; 
    f((const vec3_t*)v); 
    return 0; 
} 
+2

Raggiungere un cast non è una buona idea. Il compilatore si lamenta per una ragione. A meno che tu non sappia più del tuo compilatore, il semplice casting potrebbe portare a guai, prima o poi. –

+0

Implementare un "const-cast" sicuro tramite C11 '_Generic' è stata una delle possibili soluzioni discusse nel duplicato collegato, si veda ad esempio la risposta di chux. Se è una buona idea o no, non ne sono sicuro. Ma sarebbe al 100% sicuro, a differenza del cast originale qui. – Lundin