[Linguaggio C] Funzioni con parametri opzionali


desmo.simo
 Share

Recommended Posts

Ciao a tutti...per caso qualcuno sa mica come si fa in C a realizzare una funzione che accetta un solo parametro obbligatorio e tanti opzionali!Una cosa che insomma simili il comportamento della printf, dove solo il primo paramentro è obbligatorio, mentre quelli a seguire no...

grazie mille.

Link to comment
Share on other sites

L'idea e' quella di recuperare il puntatore del primo parametro, il quale parametro rappresenta la lista dei parametri successivi.

In questo modo sai il tipo e quindi la dimensione dei vari parametri successivi.

Se non ricordo male la dichiarazione del prototipo e':

type name(type parameter, ...);

Attento all'ordine con cui vengono impilati i parametri sullo stack, non mi ricordo mai come avviene in C, dato a seconda del linguaggio cambia. Se non ricordo male viene impilato prima l'ultimo, fino ad arrivare al primo. Comunque fai una prova e vedi.

Saluti

Cpu86

Link to comment
Share on other sites

si usano le va_list per ottenere una cosa come il printf

con una ricerca al volo su google ho trovato questo http://iupalgo.free.fr/annexes/c_cpp_reference-2.0.2/reference/C/MAN/va_start.htm

se non è buono cmq si trovano parecchi esempo in rete

ma questo non vuol dire che il secondo "non è obbligatorio"

forse un'altra cosa che ti può servire è definire valori di default, del tipo

void myFunc(int a, int b=5, char c='k');

in questo caso si può passare il primo parametro e quelli non passati assumono il valore di default

Link to comment
Share on other sites

ma ho provato ad usare valore di defaut, ma non mi funzionava!!!mi dava errore di compilazione e ho tolto...non so proprio come fare!

O meglio, grazie alla vostre soluzioni ora ho capito come.

Mi ci metto subito. Grazie mille

Se non sei molto pratico coi puntatori ti consiglio la mia soluzione, appunto per prendere dimestichezza con questi oggetti veramente potenti ;)

La sintassi di assegnazione in una dichiarazione di funzione e' la prima volta che la vedo e spero che sia l'ultima :D.

Saluti

Cpu86

Link to comment
Share on other sites

forse funziona solo con il c++ e non con il c :)

le va_list cmq sono standard c.

in ogni caso prova a metterla nella definizione del prototipo e non dove definisci la funzione (in quel caso è sicuro che ti dà errore anche se usi il c++ :P).

cpu86 è un peccato che non vuoi vedere più quella cosa, faccio il programmatore di professione e ti posso assicurare che è una manna dal cielo oltre ad essere utilizzata in tutto il mondo ;)

Link to comment
Share on other sites

forse funziona solo con il c++ e non con il c :)

le va_list cmq sono standard c.

in ogni caso prova a metterla nella definizione del prototipo e non dove definisci la funzione (in quel caso è sicuro che ti dà errore anche se usi il c++ :P).

cpu86 è un peccato che non vuoi vedere più quella cosa, faccio il programmatore di professione e ti posso assicurare che è una manna dal cielo oltre ad essere utilizzata in tutto il mondo ;)

Quella cosa vuol dire che tu sprechi tot cicli di clock solo per riempire n celle di memoria(a seconda di quanti parametri hai) quando non ti servono ;).

Link to comment
Share on other sites

non è quando non ti servono, è quando ti servono ma la maggior parte delle volte si usa sempre lo stesso valore :)

non si perdono cicli di clock (ed anzi si possono guadagnare) proprio perchè in caso contrario alla chiamata della funzione dovresti specificare ogni volta il parametro da passare.

con quel tipo di definizione invece si stabilisce un valore di default da usare nella maggioranza dei casi per le chiamate a quella funzione :)

Link to comment
Share on other sites

  • 2 weeks later...

Potresti postare l'errore che ottieni ? L'esempio di utilizzo che fai ?

Intanto di posto un banale esempietto !!

Per l'ulizzo delle primitive va_

man va_start

man vsprintf

extern int keytask;void trace(va_alist)	/* Note that the function_name and format arguments cannot be	 * separately declared because of the definition of varargs.  */va_dcl{va_list args;char *fmt;char buffer[128]; /*---------------------------------------------*/  va_start(args);  fmt = va_arg(args, char *);  /* print out remainder of message */  (void)vsprintf(buffer, fmt, args);  va_end(args);}
Link to comment
Share on other sites

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!

Register a new account

Sign in

Already have an account? Sign in here.

Sign In Now
 Share