Visualizzazione dei risultati da 1 a 3 su 3
  1. #1
    Utente di HTML.it L'avatar di gogu
    Registrato dal
    Jun 2008
    Messaggi
    169

    [C] Funzione con numero argomenti variabile

    Ciao a tutti. Sto cercando di capire meglio come usare le functions dentro il stdarg.h , tra le quali anche la va_list (voglio creare una funzione che stampa un numero indeterminato di argomenti, non necessariamente dallo stesso tipo, per es: int, char, stringa).

    Allora, la funzione che ho come esempio la vedete qua sotto. Questa funzione usa come primo parametro un formato per sapere cosa viene passato negli argomenti successivi. La funzione al tempo di run mi da il seguente errore: 'char' is promoted to 'int' when passed through '...' [enabled by default].

    Il codice è il seguente:
    codice:
    #include <stdio.h>
    #include <stdarg.h>
    
    void print_lista_argomenti(char *fmt, ...){
        va_list ap;
        int d;
        char c;
        char *s;
        
        va_start (ap,fmt);
    while(*fmt)
        switch (*fmt++){
            case 's':   //una stringa
                s=va_arg(ap,char *);
                printf ("stringa : %s\n",s);
                break;
            case 'd':   //un intero
                d=va_arg(ap, int);
                printf("Un intero: %d\n", d);
                break;
            case 'c':   //un char
                c=va_arg(ap, char);
                printf("un carattere: %c\n",c);
                break;
        }
        va_end (ap);
    }
        void main(void){
         //print_lista_argomenti ("sdc", "stringa", (int) 3, (char) 'k');
            print_lista_argomenti ("c", (char)'p');
        
            
        }
    Is 'aint over 'till is over"

  2. #2
    La documentazione della maggioranza dei compilatori recenti riporta il seguente avvertimento:
    Note: Because of default promotions, you cannot use char, unsigned char, or float types with va_arg.
    Ciò peraltro è implicitamente illustrato anche nell'esempio riportato nella "Bibbia" del linguaggio C (K&R "The C Programmning Language, 2nd ed.", pag. 216 e seguente):
    codice:
    #include <stdio.h>
    #include <stdarg.h>
    
    void minprintf(char *fmt, ...)
    {
        va_list ap;
        char *p, *sval;
        int ival;
        double dval;
    
        va_start(ap, fmt);
    
        for (p = fmt; *p; ++p)
        {
            if (*p != '%')
            {
                putchar(*p);
                continue;
            }
    
            switch(*++p)
            {
                case 'd':
                    ival = va_arg(ap, int);
                    printf("%d", ival);
                    break;
    
                case 'f':
                    dval = va_arg(ap, double);
                    printf("%f", dval);
                    break;
    
                case 's':
                    for (sval = va_arg(ap, char *); *sval; sval++);
                    {
                        putchar(*sval);
                    }
                    break;
    
                default:
                    putchar (*p);
                    break;
            }
        }
    
        va_end(ap);
    }

    La soluzione standard, in simili casi, consiste nell'usare array differenziati per tipo (i tipi di default del C sono comunque pochissimi), passando alla funzione i relativi puntatori e, per ogni array, il numero di elementi ivi contenuti. La stringa di formato va comunque benissimo, ma si devono aggirare le limitazioni inerenti la va_arg().
    • Un plauso a Grisha Perelman, raro esempio di genuino anticonformismo umano e scientifico.

  3. #3
    Utente di HTML.it L'avatar di gogu
    Registrato dal
    Jun 2008
    Messaggi
    169
    Una risposta molto dettagliata, grazie. Alla fine ho trovato anche io una soluzione.
    Is 'aint over 'till is over"

Permessi di invio

  • Non puoi inserire discussioni
  • Non puoi inserire repliche
  • Non puoi inserire allegati
  • Non puoi modificare i tuoi messaggi
  •  
Powered by vBulletin® Version 4.2.1
Copyright © 2024 vBulletin Solutions, Inc. All rights reserved.