PDA

Visualizza la versione completa : [C] Funzioni con numero di parametri variabili


Vincent
07-02-2007, 14:36
Salve a tutti, c' la possibilit di creare funzioni con numero di parametri variabili?

Un esempio la printf, il cui prototipo questo:

int printf (const char*, ...);

Come posso creare una funzione che accetti 1 oppure 4 parametri a seconda dei casi che mi servono?

Grazie a tutti

Dr. Fiemost
07-02-2007, 15:39
http://www.lilik.it/~mirko/gapil/gapilsu31.html

Vincent
07-02-2007, 20:33
io vorrei realizzare una cosa tipo printf....

ho letto il tutorial sopra ma non molto chiaro...il come si possa realizzare tutto questo...

cio

se io faccio int Ad( const char *Stringa, ... );

poi come faccio riferimento ai parametri eventualmente aggiunti nella chiamata?

forse non ho capito niente, abbiate pazienza....

:dh:

oregon
07-02-2007, 21:49
Guarda questo esempio

http://softzone.it/articoli/showarticle.php?articleID=6

andbin
07-02-2007, 21:55
Prova questo semplice programmino:

#include <stdio.h>
#include <string.h>
#include <stdarg.h>

void funz_vararg (char *formato, ...)
{
size_t len, i;
va_list ptr;
va_start (ptr, formato);

len = strlen (formato);

for (i = 0; i < len; i++)
{
if (formato[i] == 'C')
{
char val = va_arg (ptr, char);
printf ("Parametro char: %c\n", val);
}
else if (formato[i] == 'I')
{
int val = va_arg (ptr, int);
printf ("Parametro int: %d\n", val);
}
else if (formato[i] == 'S')
{
char *val = va_arg (ptr, char*);
printf ("Parametro char*: %s\n", val);
}
}

va_end (ptr);
}

int main (void)
{
funz_vararg ("IS", 10, "ciao");
printf ("-----------\n");
funz_vararg ("CISC", 'A', 24, "prova", 'Z');
return 0;
}
Se non chiaro, spiego.

Vincent
08-02-2007, 00:04
io utilizzo dev-cpp, e compilando mi da questi errori:

In function `funz_vararg':

[Warning] `char' is promoted to `int' when passed through `...'

[Warning] (so you should pass `int' not `char' to `va_arg')

if this code is reached, the program will abort


:bh:

andbin
08-02-2007, 00:10
Originariamente inviato da Vincent
io utilizzo dev-cpp, e compilando mi da questi errori:

In function `funz_vararg':

[Warning] `char' is promoted to `int' when passed through `...'

[Warning] (so you should pass `int' not `char' to `va_arg')

if this code is reached, the program will abort


:bh: Nessun warning a me con VC++ ... comunque solo un warning che dice che in effetti un char viene passato come int, quindi credo che sia meglio mettere:

char val = (char) va_arg (ptr, int);

nel caso di if (formato[i] == 'C')

oregon
08-02-2007, 01:24
Per DevCpp, per evitare una exception (legata all'implementazione di queste funzioni), devi scrivere

char val = va_arg (ptr, int);

Vincent
08-02-2007, 10:36
Grazie a tutti siete stati gentilissimi, vorrei solo aver informazioni pi dettagliate riguardo la faccenda, cio il funzionamento dei puntatori alla lista di parametri...

cosa sono va_list, va_start, va_arg e va_end? esiste qualche thread che ne parla oppure qualcuno me le spiega :zizi:

Grazie ancora :ciauz:

andbin
08-02-2007, 10:40
Originariamente inviato da Vincent
cosa sono va_list, va_start, va_arg e va_end? esiste qualche thread che ne parla oppure qualcuno me le spiega :zizi: http://www-ccs.ucsd.edu/c/stdarg.html

Loading