/*---------------------------------------------------------------
varg
Programma che richiama una funzione con un numero variabile di
parametri. I parametri in numero variabile devono essere tutti
dello stesso tipo e devono essere gli ultimi della chiamata.
Nell'esempio proposto gli argomenti in numero variabile sono co-
stituiti da una struttura composta da una parte numerica ed una
alfabetica. La funzione che li riceve crea una struttura in cui
la parte numerica e' la somma dei numeri mentre quella alfabetica
e' la concatenazione delle stringhe. Si assume che l'ultimo
parametro variabile abbia la parte numerica pari a zero.
E' necessario inserire lo header standard stdarg.h. Inoltre nella
funzione con numero variabile di parametri si definisce un dato
di tipo va_list.
Il primo degli argomenti variabili viene recuperato con la fun-
zione va_start e con l'argomento citato esplicitamente. I succes-
sivi tramite la funzione va_arg, in cui si passa il tipo degli
argomenti.
Alla fine, la memoria usata viene liberata tramite chiamata
alla funzione va_end.
Un esempio pratico dovrebbe sperabilmente chiarire le cose. La
funzione media viene richiamata con un numero variabile di argo-
menti di tipo double. Tale numero costituisce il primo argomento
della funzione. Quindi:
double media (int n, double a, ...)
{
va_list ap;
double tmp;
int i;
tmp = va_start (ap, a); // solo il primo
for (i = n; n > 1; i--)
tmp += va_arg (ap, double); // dal secondo in poi
va_end (ap);
return tmp / (double) n;
}
---------------------------------------------------------------*/
#include <stdarg.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#define True 1
#define False !True
typedef struct {char alf[50]; int num;} stru;
int main (void)
{
int i;
stru array [3], sommastru (stru, ...), tmp;
strcpy (array [0].alf, "arco");
strcpy (array [1].alf, "baleno");
array [0].num = 1;
array [1].num = 0;
printf ("\tdati di partenza\n");
for (i = 0; i < 2; i++)
printf ("parte num. %d; parte alf. %s\n", array [i].num, array [i].alf);
tmp = sommastru (array [0], array [1]);
printf ("\tsomma\n");
printf ("parte num. %d - parte alf. %s\n", tmp.num, tmp.alf);
strcpy (array [0].alf, "Dudel");
strcpy (array [1].alf, "sack");
strcpy (array [2].alf, "pfeifer");
array [0].num = 1;
array [1].num = 2;
array [2].num = 0;
printf ("\tdati di partenza\n");
for (i = 0; i < 3; i++)
printf ("parte num. %d; parte alf. %s\n", array [i].num, array [i].alf);
tmp = sommastru (array [0], array [1], array [2]);
printf ("\tsomma\n");
printf ("parte num. %d - parte alf. %s\n", tmp.num, tmp.alf);
exit (EXIT_SUCCESS);
}
stru sommastru (stru a, ...)
{
int count = 0, fine = True;
stru r, tmp;
va_list ap;
r.num = 0;
memset (r.alf, (int) NULL, sizeof r.alf);
do
{
if (count++)
{
tmp = va_arg (ap, stru);
strcat (r.alf, tmp.alf);
r.num += tmp.num;
if (! tmp.num)
fine = False;
}
else
{
va_start (ap, a);
strcpy (r.alf, a.alf);
r.num += a.num;
if (! a.num)
fine = False;
}
}
while (fine == True);
va_end (ap);
return r;
}