1

Je trouve une erreur indiquant "erreur: affectation à une expression avec type tableau" pour mon morceau de code suivant compilé dans gcc 6.1.0 mais pas dans gcc 4.4.6.Erreur trouvée uniquement dans gcc-6.1.0 lors de l'analyse des arguments à l'aide de va_arg()

void foo(char *fmt, ...) 
{ 
    va_list ap; 
    int d; 
    char *c, *s; 
    typedef unsigned char mac_t[6]; 

    mac_t ad; 
    va_start(ap, fmt); 
    while (*fmt) 
    switch (*fmt++) { 
    case 's': 
     s = va_arg(ap, char *); 
     printf("string %s\n", s); 
    break; 
    case 'd':    /* int */ 
     d = va_arg(ap, int); 
     printf("int %d\n", d); 
    break; 
    case 'c':    /* char */ 
     ad = va_arg(ap, mac_t); //**** error here only on gcc 6.1.0 compiler 
     printf("With unsigned char: char %c.%c.%c.%c.%c.%c\n", ad[0],ad[1],ad[2],ad[3],ad[4],ad[5]);            
    } 
    va_end(ap); 
} 
int main() 
{ 
    foo("%c", "AABBCC"); 
}  

Comment puis-je résoudre cette erreur? En gcc 4.4.6, la compilation passe bien. Pour certaines raisons, je dois utiliser le compilateur gcc 6.1.0 uniquement.

+0

J'ai essayé strcpy (ad, va_arg (ap, mac_t)) ;. Cela ne me donne aucune erreur de compilateur. Mais cela ne sert pas le but. Je veux dire, les arguments ne sont pas copiés dans la publicité du tableau. Je vois des données invalides lorsque j'imprime le contenu de l'annonce. –

+1

Les tableaux se désintègrent en un type de pointeur lorsqu'ils sont transmis à une fonction. gcc 6.1.0 le fait bien, vous ne pouvez pas l'assigner à un tableau. – jxh

+0

@jxh Exactement. strcpy() ne fonctionne pas sur les pointeurs. Toute autre façon d'analyser les arguments dans gcc 6.1.0? –

Répondre

1

Vous avez:

typedef unsigned char mac_t[6]; 
mac_t ad; 

Et puis vous essayez:

ad = va_arg(ap, mac_t); 

Quand vous avez passé l'argument comme celui-ci:

foo("%c", "AABBCC"); 

Ceci est une erreur. Vous ne pouvez pas affecter à un tableau. En outre, "AABBCC" est un tableau [7] de char en raison du littéral de chaîne terminé par NUL. Cependant, cela n'a pas d'importance. foo() reçoit un char *, puisqu'un type de tableau décline en le pointeur contenant l'adresse de son premier élément.

Vous devriez pouvoir voir l'erreur si vous transmettez -std=c99 à GCC. Apparemment, cela permet une vérification plus stricte.

gcc -std=c99 -W -Wall -O c.c 
c.c: In function ‘foo’: 
c.c:25:12: error: incompatible types when assigning to type ‘mac_t’ from type ‘unsigned char *’ 
     ad = va_arg(ap, mac_t); // error here only on gcc 6.1.0 compiler 
      ^

Pour résoudre ce problème, dites-vous va_arg l'analyse d'un pointeur. Si vous devez copier le contenu, utilisez strncpy.

strncpy((void *)ad, va_arg(ap, char *), sizeof(ad)); 

Nous ad le contraindre, parce strncpy attend un char * comme premier argument.

+0

Oui. Cette solution a fonctionné. –