PDA

View Full Version : [C] Funzione con num argomenti variabile


cn73
12-04-2004, 20:12
Come posso realizzare una funzione che accetti in input un num di argomenti variabile??

int print_log(FILE *stream, const char *format,char *arg1,arg2..argn){

....

fprintf(stream,format,arg1...argn );
....
fflush(stream);
close(stream);
...
} [

Grazie :)

Tortellone
12-04-2004, 21:17
Dal profondo della mia ignoranza so che ad es. in C++ è possibile l'overloading di una funzione..
Non so se in C si possa fare ma mi pare di no..
L'overloading di una funzione permette di dichiarare più prototipi di una stessa funzione. Ogni prototipo può differire per numero di parametri e tipi (mi pare). Poi ci pensa il compilatore a capire quale prototipo utilizzare :)

Spero che sia stato di aiuto e che non abbia detto sciocchezze..

Ziosilvio
12-04-2004, 22:52
Originariamente inviato da cn73
Come posso realizzare una funzione che accetti in input un num di argomenti variabile??

E' una cosa che non ho mai fatto.

Esistono tre macro, va_start, va_arg e va_end, definite in stdarg.h.
Prova a leggere la documentazione del compilatore, le man pages, o il Kernighan&Ritchie.

In alternativa, potresti passare come argomento un array di stringhe, e fare del parsing.

supertonno
13-04-2004, 01:36
Certo che si puo, pero devi passare alla funzione un puntatore ad un array o a una lista, o a quel che vuoi.
Poi dentro la funzione, in base alla struttura dati che hai usato, ti regoli di conseguenza.
OK?

cionci
13-04-2004, 02:41
Originariamente inviato da Ziosilvio
E' una cosa che non ho mai fatto.

Esistono tre macro, va_start, va_arg e va_end, definite in stdarg.h.
Prova a leggere la documentazione del compilatore, le man pages, o il Kernighan&Ritchie.

In alternativa, potresti passare come argomento un array di stringhe, e fare del parsing.
Anche io non l'ho mai fatto...ma il metodo che sano le varie scanf e printf è porprio questo...

Luc@s
13-04-2004, 09:42
ho pero letto che nn è molto sicuro usare i vari va_XXX.

fpucci
13-04-2004, 09:46
Originariamente inviato da Luc@s
ho pero letto che nn è molto sicuro usare i vari va_XXX.

Tranquillo.
Le ho usato e vanno alla grande.
L'unica accortezza da usare è che bisogna ricordarsi che queste funzioni sono delle MACRO e pertanto vanno trattate con le dovute attenzioni che tipicamente si riservano alle macro cel C.

cionci
13-04-2004, 09:48
Originariamente inviato da Luc@s
ho pero letto che nn è molto sicuro usare i vari va_XXX.
Boh...non ho mai letto niente in proposito...
Allora la printf non è sicura ?

Luc@s
13-04-2004, 09:54
secondo il manuale della Libc anche printf è insicura :eek:

cionci
13-04-2004, 09:59
Hai un link ?

Luc@s
13-04-2004, 10:07
ora ho riletto il manuale.
Dice che printf e sprintf nn sono sicuri poiche nn permettono di decidere quanti byte scrivere.
Cmq qua (http://www.gnu.org/software/libc/manual/html_mono/libc.html) dovresti trovare qualcosa.

cionci
13-04-2004, 10:34
ok...ma è una insicurezza intrinseca di printf (e anche di scanf), ma non certo un problema del passaggio dei parametri...

cn73
13-04-2004, 11:42
Pensavo anche io di passare una stringa e poi parsificarla...ma diventerebbe sconveniente in questo modo creare poi gli argomenti da pasare alla funzione stessa... in fondo devo solo fare 2 operazioni "comuni" a ogni chiamata...

cn73
13-04-2004, 20:03
Originariamente inviato da Ziosilvio
E' una cosa che non ho mai fatto.

Esistono tre macro, va_start, va_arg e va_end, definite in stdarg.h.
Prova a leggere la documentazione del compilatore, le man pages, o il Kernighan&Ritchie.

In alternativa, potresti passare come argomento un array di stringhe, e fare del parsing.


Ho approfondito...è proprio così ;)
basta dichiarare la funzione

int print_log(FILE *stream, const char *format, ... )



coi 3 puntini...grazie!

cn73
13-04-2004, 21:00
Ecco, semplicissimo!

#include <stdlib.h>

void print_log(FILE *stream, char *format, ... ){

va_list args; //punta agli argomenti privi di nome...
va_start(args,format); //punta al primo argomento...

...
vfprintf(stream,format,args);
...
fflush(stream);

va_end(args);

}