View Full Version : [C] Funzione con num argomenti variabile
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?
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...
ho pero letto che nn è molto sicuro usare i vari va_XXX.
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.
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 ?
secondo il manuale della Libc anche printf è insicura :eek:
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.
ok...ma è una insicurezza intrinseca di printf (e anche di scanf), ma non certo un problema del passaggio dei parametri...
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...
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!
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);
}
vBulletin® v3.6.4, Copyright ©2000-2026, Jelsoft Enterprises Ltd.