View Full Version : [C] Argomenti opzionali funzione
Ciao,
posso rendere facoltativo un parametro di una funzione?
mettiamo di avere
int a(int, int, int);
richiamando questa funzione devo scrivere qualcosa tipo
a(2,6,0);
ma io vorrei poter scrivere anche solo
a(2,6);
l'ordine dei parametri rimane il medesimo: se la funzione prevede 3 parametri ed io ne inserisco 2 saranno i primi 2 ad avere un valore mentre il terzo (anche se ha delle celle allocate) non viene inizializzato con alcun valore oppure gli viene impostato un valore a scelta, non ha importanza
allora è possibile in C ?
BlackShark92
13-06-2011, 00:10
Ciao,
posso rendere facoltativo un parametro di una funzione?
mettiamo di avere
int a(int, int, int);
richiamando questa funzione devo scrivere qualcosa tipo
a(2,6,0);
ma io vorrei poter scrivere anche solo
a(2,6);
l'ordine dei parametri rimane il medesimo: se la funzione prevede 3 parametri ed io ne inserisco 2 saranno i primi 2 ad avere un valore mentre il terzo (anche se ha delle celle allocate) non viene inizializzato con alcun valore oppure gli viene impostato un valore a scelta, non ha importanza
allora è possibile in C ?
Sinceramente non ho mai provato, comunque in ogni caso dovresti mettere la virgola dopo il secondo parametro lo stesso. Anche se non credo C faccia fare ciò, nella definizione di una funzione vengono specificati i parametri che la funzione DEVE ricevere :D tu prova lo stesso
In C++ e C# 4.0 ci sono i parametri di default, cioè
void funzione( int a, int b, const char* c = NULL, int d = 0 );
//è valido sia
funzione( 1,2 );
//che
funzione( 1,2, "lol" );
//che
funzione( 1,2, "lol", 99 );
Ma non mi ricordo se in C c'è.
clockover
13-06-2011, 10:12
Questo potrebbe fare al caso tuo http://www.thinkage.ca/english/gcos/expl/c/incl/stdarg.html
sì boh, a sto punto fai prima a farti un wrapper
La soluzione più pulita, che evita ridondanze nel codice, che mi viene in mente è la seguente:
int main()
{
funzione2(a,b);
funzione(a,b,c)
}
void funzione2(int a, int b)
{
funzione(a,b,0);
}
void funzione(int a, int b,int c)
{
...
}
La funzione con 2 parametri non fa altro che richiamare la funzione con 3 parametri aggiungendo quello mancante, ossia quello di default.
PS: credo sia la stessa soluzione proposta da tuccio.
ok allora non si può fare
grazie per le risposte
preferisco evitare di far eseguire due funzioni piuttosto che una sola
clockover
13-06-2011, 11:49
ok allora non si può fare
grazie per le risposte
preferisco evitare di far eseguire due funzioni piuttosto che una sola
Ma li leggi tutti i messaggi??
BlackShark92
13-06-2011, 19:21
Comunque mi pare di aver letto che quando non si vuole specificare un parametro da passare, basta scrivere nella funzione l'ellissi (3 punti) in corrispondenza del parametro
clockover
13-06-2011, 20:09
quello è C++.
E' anche C
http://linux.die.net/man/3/sprintf
infatti include la libreria stdarg.h
http://en.wikipedia.org/wiki/Stdarg.h
L'ho scritto anche prima... :rolleyes:
edit:
deprecated in C++
clockover
13-06-2011, 20:23
ah cavolo, non mi ricordavo esistesse anche in C. comunque in C++ non è deprecato stdarg.h, ma solo l'uso dell'header C, se usi <cstdarg> non c'è nessun pericolo.
si giusto infatti intendevo proprio stdarg.h...
comunque bisogna avere l'accortezza di inserire almeno un parametro
PS: credo sia la stessa soluzione proposta da tuccio.yup
sottovento
15-06-2011, 15:41
Questo potrebbe fare al caso tuo http://www.thinkage.ca/english/gcos/expl/c/incl/stdarg.html
Questa e' LA soluzione "pulita" nel caso del C. E' cosi' che si dovrebbe fare in C.
C'era la pratica sadomaso, qualche anno fa, di andare a sfrucugliare direttamente nello stack. Sapendo che i parametri vengono messi nello stack con una push cosi' come vengono trovati, avendo l'indirizzo di un parametro si puo' risalire a tutti gli altri, anche se non li hai dichiarati. La sintassi K&R ovviamente non lo proibiva, quindi uno poteva scrivere
call_func(a,b,c,d,e,f,g,h,i);
e la funzione era dichiarata come
void call_func(a)
int a
{
int *p = &a;
--p;
int b = *p;
}
e cosi' via. Ovviamente e' uno dei migliori sistemi per farsi del male, che unisce il peggio dell'uso puntatori con la fiducia (mal riposta) che il formato del record di attivazione implementato dal compilatore non cambi. Il codice risultava ingestibile perfino dopo un semplice aggiornamento del compilatore....
C'era la pratica sadomaso, qualche anno fa, di andare a sfrucugliare direttamente nello stack.
:eek:
ciao!
british
vBulletin® v3.6.4, Copyright ©2000-2025, Jelsoft Enterprises Ltd.