2010-12-11 58 views
2

J'essaie de créer ma propre fonction printf, mais ça ne marche pas. La sortie semble être le format correct, mais les paramètres ne sont pas transmis correctement, il semble, et je reçois des valeurs de garbage. J'utilise GCC. Voir le code ci-dessous.Pourquoi mes arguments varidiques ne fonctionnent-ils pas en C?

void con_printf(char *fmt, char attr, ...) 
{ 
    char *s = printf_buffer; 
    va_list args; 
    va_start(args, fmt); 
    vsnprintf(s, CON_TMPSIZE, fmt, args); 
    va_end(args); 
    while(*s != '\0') 
    { 
     con_putchr(*s, attr); 
     s++; 
    } 
    con_flush(); 
} 

printf_buffer est défini comme CON_TMPSIZE octets de long, qui est de 128 octets dans cette version. C'est pour un petit microcontrôleur, mais je m'attends à ce que le principe s'applique à n'importe quel processeur.

Je l'appelle comme ceci:

con_printf("LOOP a %d\n", 0, 10); 
con_printf("LOOP b %d\n", 0, 12); 

Je me attends LOOP 10 à imprimer sur la première ligne, et LOOP b 12 sur l'autre, mais je reçois LOOP a 542 et LOOP b 542.

+0

nous montrent Veuillez l'appelant, et les arguments étant passé dans – EvilTeach

+0

@EvilTeach - a ajouté le code de l'appelant –

Répondre

4

Avec va_start vous spécifiez, à quel point les arguments de variable commencent.

Depuis votre liste d'arguments variables de la fonction commence après attr, vous devrez:.

va_start(args, attr); 
+0

Merci pour votre suggestion mais ça ne marche toujours pas. La sortie n'a pas changé depuis ce qu'elle était. –

+0

Hmm. J'ai allumé ma machine virtuelle, j'ai exécuté ce code et cela m'a donné les résultats attendus. Sur quelle machine votre code est-il compilé? –

+0

Il fonctionne sur un microcontrôleur, un dsPIC33FJ128GP802. –