PDA

View Full Version : [C] Numero variabile di argomenti


mjk
02-04-2003, 11:12
Ciao a tutti, ho un problema di "eleganza formale" in C (non C++, badate bene). Devo scrivere una sorta di API, e ho tre funzioni praticamente uguali a meno del numero di parametri che devono prendere:

void f1(double x);
void f2(double x, unsigned y);
void f3(double x, unsigned y, double z);

f1 non è che f2 con y = 0, e f2 è f3 con z qualsiasi.

Voglio "consensarle" in un'unica funzione per semplificare la vita a chi dovrà usare queste funzioni. In C++ penso che avrei potuto usare:

void f(double x, unsigned y = 0, double z = 0.0);

In C ho fatto:

#include <stdarg.h>

void f(double x, ...) {
va_start(ap, x);
y = va_arg(ap, unsigned);
z = va_arg(ap,double);
va_end(ap);
etc...
}

Il problema è che se la chiamo con (a è un double)

f(a);

y e z assumono un valore qualsiasi! Io voglio accorgermi se y non è stato passato e in tale caso porre y = 0.

P.S.: soluzione indesiderata il passaggio, come primo argomento, del numero di argomenti che si passano: in tale caso tanto vale usare tre funzioni diverse f1,f2,f3.

Scusate per il post lungo e per la domanda assurda.
Ciao e grazie,

::mjk::

cionci
02-04-2003, 11:29
Sinceramente non l'ho mai usate, ma credo che basti controllare se ap == NULL...

mjk
02-04-2003, 13:13
Grazie del consiglio, ho provato ma non funziona. Dopo aver dichiarato, con va_start, qual'è l'ultimo argomento "certo", ap punta alla locazione di memoria immediatamente successiva, non curandosi se in essa sono scritti o meno gli argomenti opzionali. Mi sa che non c'è alcun metodo per effettuare l'operazione che voglio io...

/\/\@®¢Ø
02-04-2003, 13:22
Originally posted by "mjk"


Il problema è che se la chiamo con (a è un double)

f(a);

y e z assumono un valore qualsiasi! Io voglio accorgermi se y non è stato passato e in tale caso porre y = 0.

Se non ricordo male non hai modo di capire direttamente quanti e quali argomenti sono stati passati. E' tuo compito stabilirlo (ad esempio le funzioni di output del C guardano la stringa per inferire i parametri passati ).

Secondo me se ti interessa solo l'eleganza , e' meglio se ti tieni le tre funzioni separate. Risultera' anche piu' semplice l'utilizzo da parte dell'utente visto che gli eviterai errori subdoli (ad esempio se chiami la funzione con secondo e terzo parametro scambiati il compilatore non se ne accorge)

mjk
02-04-2003, 13:54
Mi sa che hai proprio ragione... grazie mille a tutti!

bye,

::mjk::