Entra

View Full Version : [C] Argomenti opzionali funzione


biowep
12-06-2011, 23:27
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

Tommo
13-06-2011, 01:01
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

tuccio`
13-06-2011, 10:45
sì boh, a sto punto fai prima a farti un wrapper

oNaSsIs
13-06-2011, 11:37
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.

biowep
13-06-2011, 11:47
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

tuccio`
13-06-2011, 20:38
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....

british
16-06-2011, 23:25
C'era la pratica sadomaso, qualche anno fa, di andare a sfrucugliare direttamente nello stack.

:eek:

ciao!

british