Sei sulla pagina 1di 3

2

Definizione
 Le funzioni che ricevono un numero variabile
Funzioni con di parametri sono dette funzioni variadic o
numero variabile di argomenti funzioni varargs
 tipo nomeFunzione(arg1, arg2, ...);
 L’ellissi ... (tre punti) indica che ci possono
essere altri parametri dopo quelli fissi
Ver. 2.4
 Deve esserci almeno un parametro fisso
 L’ellissi può essere indicata solo come ultimo
elemento di una lista di parametri
 Le macro e le definizioni da utilizzare sono
indicate in <stdarg.h>
© 2010 - Claudio Fornaro - Corso di programmazione in C

3 4

Inizializzazione Utilizzo
 All’interno di una funzione variadic bisogna  La macro
definire una variabile di tipo va_list, questa va_arg(argP, tipo)
(argument pointer) punterà in sequenza a restituisce un valore del tipo indicato
ciascuno degli argomenti aggiuntivi prelevandolo dall’elemento anonimo puntato
(“anonimi”), elencati dopo quelli fissi: da argP nella lista variabile, dopodiché
va_list argP; modifica argP affinché punti al successivo
 La macro va_start inizializza la variabile elemento anonimo:
argP in modo che punti al primo degli x = va_arg(argP,int);
argomenti anonimi, è necessario fornire il  Ogni chiamata a va_arg preleva il successivo
nome dell’ultimo argomento fisso valore dalla lista variabile
(nell’esempio seguente è arg2):
va_start(argP, arg2);
5 6

Terminazione Esempio
 Dopo che gli argomenti anonimi sono stati #include <stdarg.h>
elaborati, per indicare che non si intende più #include <stdarg.h>
scandire gli elementi di argP, si deve void stampa(int quanti, ...);
chiamare la macro va_end prima che termini main()
{
la funzione che la chiama: stampa(0);
va_end(argP); stampa(1, "END");
 I parametri possono essere scanditi più volte: stampa(2, "END", "with no exit code");
è sufficiente chiamare va_end e poi stampa(3, "END", "with code ", 8);
nuovamente va_start return 0;
}

7 8

Esempio Numero di argomenti anonimi


void stampa(int quanti, ...)  Per indicare alla funzione quanti sono i
{
va_list ap; quanti: ultimo parametri, si può:
va_start(ap, quanti); argomento fisso  passare tale valore come argomento fisso
if (quanti >= 1)  terminare la lista degli argomenti facoltativi con un
printf(" %s", va_arg(ap, char*) ); valore speciale (sentinella)
if (quanti >= 2)
printf(" %s", va_arg(ap, char*) );
 Esempio
if (quanti >= 3) Chiamata:
printf(" %d", va_arg(ap, int) ); maxstr(4, s0,s1,s2,s3);
printf("\n");
va_end(ap);
Nella funzione si ha:
} while (quanti-- > 0)
printf("%s", va_arg(ap, char*));
9 10

Numero di argomenti anonimi Tipi dei parametri


 Esempio  Per i parametri anonimi non c’è alcuna
Chiamata (tutti valori interi): indicazione di tipo nel prototipo della
sumposit(1, 2, 3, 0); funzione, quindi si hanno le promozioni di
Nella funzione si ha:
while ((x=va_arg(ap, int)) != 0)
default:
printf("%s", x);  per gli interi si applicano le promozioni integrali
Notare il cast  un valore float viene convertito in double
 Esempio
Chiamata (tutte stringhe):  Una chiamata come va_arg(ap,float)
maxstr(s0,s1,s2,s3,(char *)NULL); non è corretta perché i float vengono
Nella funzione si ha: convertiti in double
while ((p=va_arg(ap,char*)) !=NULL)
printf("%s", p);

11 12

Tipi dei parametri Esercizi


 Soluzione  Scrivere e collaudare la funzione
 Per passare float e double usare double char * mstrcat(char *prima, ...)
 Per passare char, int e short usare int che concateni un numero arbitrario di
 Per passare vettori usare un puntatore stringhe nella prima passata come
 Un puntatore sentinella a NULL deve avere il cast argomento. Per il resto abbia lo stesso
(come nel secondo esempio di maxstr) comportamento della strcat.
 Attenzione: anche l’ultimo argomento fisso
deve essere di un tipo che non subisce
promozioni di default
 Per passare puntatori a funzione conviene
definire il tipo della funzione con typedef