Newsgroup: it.comp.os.linux.development
Titolo: come scrivere funzioni con numero arbitrario di parametri?

Salve,
prima di lanciarmi a capofitto a  scrivere codice, volevo chiedere a voi
programmatori scafati una cosuccia semplice semplice (e poi prometto che
non vi  rompero` le scatole  sugli algoritmi  perche` per quelli  ho dei
buoni testi):  come si scrive una  funzione con un numero  arbitrario di
parametri, ovvero come la printf()?
Cio` di  cui ho bisogno e`  esattamente questo: una funzione  in tutto e
per tutto simile alla printf, ma con  un argomento in piu` che e` un int
e che specifica se mandare a video  o meno la stringa. In pratica vorrei
definire un livello  di "verbosita`" di una procedura di  debug, in modo
tale che, se il livello e` inferiore a quello specificato sulla linea di
comando, stampo il messaggio, altrimenti no.
Una cosa del tipo:
    debug(2, "Connessione al server: %s\n", srv_hostname);
    debug(9, "bytes letti: %d\n", br);
dove, se il livello di "verbosita`" di debug e` 3, per esempio, il primo
messaggio verra` stampato, ma il secondo no.
Thanks in advance. (-:
-- 
  _      ___ ____
 | | /| / (_)_  /
 | |/ |/ / / / /_	ANTI-SPAM WARNING:
 |__/|__/_/ /___/	the e-mail address is fake.
 
Errare e` umano, ma per fare *veramente* casino ci vuole la password di root.

parametri, ovvero come la printf()?
Ciao, 
da' un'occhiata a stdarg(3). 
Un esempio,
/* NON TESTATO */
#include <stdarg.h>
 
int 
somma_interi_quanti_ne_vuoi ( int n, ... )   
/*  I tre puntini indicano la presenza di parametri in 
 *  numero variabile e devono stare dopo tutte le 
 *  altre variabili */
{
	va_list	
		args;
		/*La lista che contiene tutti i parametri 
		 * deve essere dichiarata 		
		 */
	int 
		i,res=0,tmp;
 
	va_start(args,n); 
	/* La lista viene inizializzata all'ultimo parametro fisso */
 
	for (i=0;i<n;i++) 
	{
		curr=va_arg(args,int); /* Legge il parametro nella lista, 
					* aspettandosi un intero. ATTENZIONE:
					* se non e' effettivamente un intero 
					* si ha un comportamento imprevedibile*/
		res+=curr;
	}
	va_end(args); 			/* Chiude la lista */
	return res;
}
... 
...
int main()
{
	int 
		somma5,somma3;
	....
	somma5=somma_interi_quanti_ne_vuoi(5,10,20,30,40,50);
	somma3=somma_interi_quanti_ne_vuoi(3,100,200,300);
	....
 
}
 
-- 
LB
per contattarmi via email:
mest...@laika.mynet non e' un indirizzo valido
ludbasil (at) 
inwind.it
 lo e' 

 e che specifica se mandare a video  o meno la stringa. In pratica vorrei
#include <stdarg.h>
void debug(int level, char *template, ...)
{
 va_list arglist;
 if(level>=minlevel) {
    va_start(arglist, template);
    vfprintf(stderr, template, arglist);
    }
}
Ciao
 David
-- 
<d.santinoli presso mi. flashnet. it>

}
Visto cosi` sembra *quasi* semplice, ma credo che mi studiero` lo stesso
la manpage, per precauzione. Grazie 1024. ;-)
-- 
  _      ___ ____
 | | /| / (_)_  /
 | |/ |/ / / / /_	ANTI-SPAM WARNING:
 |__/|__/_/ /___/	the e-mail address is fake.
 
Sempre in forma ed informati con il confetto FAQ! (D. Alberani)

comando, stampo il messaggio, altrimenti no.
Somiglia tanto alla jprintf :-)
Una versione beta la trovi dentro iplogd.tgz su
 
http://www.linuxvalley.com/~lserni/iplogd.html
altrimenti se te la senti di fare da beta tester per la 3.0... 8-D
+++
Supporto: stdout, stderr, syslog, file a scelta. Possibilita' di
definire un livello di verbosita' enorme con flag 'post_mortem',
per cui vengono registrati i dettagliatissimi messaggi, dei soli
ultimi dieci secondi di vita del programma 8-D. Eccetera.
E' prevista la possibilita' di registrare dati come la memoria o
il numero di descrittori disponibili ad ogni call (ottima per un
ciclo, per pescare eventuali leaks).
Leonardo
".signature": bad command or file name