PDA

Visualizza la versione completa : [C] Macro per il fattoriale


Smoke666
27-01-2013, 13:23
Ciao a tutti, sto trovando molte difficoltà nella definizione di una macro per il calcolo del fattoriale. Non ho mai sviluppato macro "complesse", e non capisco come potrei fare per definirla. Sono partito da una definizione mediante funzione ricorsiva del problema, ovvero:



int fact(x){
if(x == 1) return x;
return x*(fact(x-1));
}


Quindi pensavo di definire la macro in questo modo, ovvero ricorsivamente:



#define fact(x) \
(x*(fact(x-1))


Tuttavia quando viene espansa, fact(x-1) non viene risolta (come definito nello standard ANSI) e non riesco a trovare una soluzione a questo problema. Non credo di poter usare un ciclo nella definizione, e quindi devo cercare di risolvere la macro in una forma simile a questa:



#define fact(x) ((x==0) ? x : x*(x-1))


In questo modo però moltiplico solo i primi due valori (ovvero x e x-1). Come devo procedere per espandere anche gli altri valori, fino a che non arrivo ad avere x=1 ?

MItaly
27-01-2013, 13:59
Devi necessariamente scriverla come macro? :confused:

Smoke666
27-01-2013, 15:00
E' un esercizio per l'esame di sistemi operativi e nel capitolo relativo al preprocessing viene richiesto espressamente la risoluzione con una macro :confused: Sono confuso proprio per questo motivo, non so come utilizzare delle macro ricorsive, e neppure i manuali che ho consultato trattano questo argomento..

Scara95
27-01-2013, 17:58
Forse puoi fare qualcosa con l'operatore , (comma operator)...

Smoke666
28-01-2013, 01:32
Mmm ok grazie per il suggerimento, andrò a documentarmi!

MItaly
28-01-2013, 02:34
La questione non è banale... di base (come intento) le macro C non supportano la ricorsione, tant'è che, se nell'espansione di una macro compare nuovamente il suo nome, questo non viene ulteriormente espanso (viene "temporaneamente #undef-inito" per la durata dell'espansione della macro corrente). Leggi ad esempio qui (http://nealabq.com/blog/2008/08/14/the-c-preprocessor-recursion/).

Si può barare (http://bannalia.blogspot.it/2008/10/c-preprocessor-tail-recursion.html), ma sono tecniche estremamente bizzarre - trasforma la ricorsione del fattoriale in una tail recursion, che riesce a gestire con il preprocessore sfruttando magie che non ho ben capito.

Smoke666
28-01-2013, 10:05
Ti ringrazio per i due link, devo ammettere che non ho capito molto :confused: Comunque ti ringrazio, ci lavorerò su! :D

Smoke666
30-01-2013, 16:25
Lo scrivo sperando che possa essere d'aiuto a qualcun altro. La questione era più semplice di quanto non pensassi, ho risolto utilizzando questa semplice macro:



#define FACT(X) int k=X, i; for(i=1; i<X;i++) {k *= i;} printf("%d\n", k);

c0der
30-01-2013, 16:58
Non mi pare proprio che risolva, da come avevi impostato il post sembrava che volessi poter fare:
int n = FACT(100);
cosa che la "soluzione" proposta certo non risolve.
Ciao

Smoke666
30-01-2013, 18:18
Lo so, ma ho adottato questa soluzione "alternativa" considerando che una macro non è necessario che si comporti come una funzione. Non avendo una spiegazione più dettagliata del problema (la traccia dice solo: scrivere una macro per il calcolo del fattoriale) ho ripiegato su questa soluzione.

Loading