2016-05-04 16 views
5

Mam następujący kod:Problemy z const w C kiedy posiadające typedef i tablicę

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

który nie zostanie skompilowany przy użyciu

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

ale dają Błąd

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]){ 
    ^

Jeśli Z drugiej strony usuwam wymóg const w funkcji f. Wszystko działa dobrze. Nie mogę się dowiedzieć, co jest nie tak?

+0

Zobacz także: http://stackoverflow.com/questions/28062095/pass-a-two-dimensional-array-to-a-function-of-constant-parameter –

+0

Jak wspomniano w mój link dupe, jest to prawdopodobnie usterka w systemie typu C. Myślę, że to podkreśla, dlaczego ukrywanie wskaźników lub tablic za 'typedef' nie jest dobrym pomysłem. – user694733

+0

Nie jest to dokładny duplikat, ponieważ powiązane pytanie dotyczyło wskaźników tablicy. W takim przypadku istnieją tablice 2D. Odpowiedź będzie jednakowa. – Lundin

Odpowiedz

0

Dlaczego nie przesłać parametru do stałej?

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

Osiągnięcie do obsady nie jest dobrym pomysłem. Kompilator uskarża się z jakiegoś powodu. Jeśli nie wiesz więcej niż twój kompilator, po prostu rzucanie może prędzej czy później doprowadzić do kłopotów. –

+0

Implementacja bezpiecznego "const cast" przez C11 '_Generic' była jednym z możliwych rozwiązań omawianych w połączonym duplikacie, patrz na przykład odpowiedź przez chux. Jeśli to dobry pomysł, nie jestem pewien. Ale byłby w 100% bezpieczny, w przeciwieństwie do surowej obsady. – Lundin