Pagina 1 di 2 1 2 ultimoultimo
Visualizzazione dei risultati da 1 a 10 su 17
  1. #1
    Utente di HTML.it
    Registrato dal
    Mar 2012
    Messaggi
    214

    [C] Macro per il fattoriale

    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:

    codice:
    int fact(x){
        if(x == 1) return x;
       return x*(fact(x-1));
    }
    Quindi pensavo di definire la macro in questo modo, ovvero ricorsivamente:

    codice:
    #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:

    codice:
    #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 ?

  2. #2
    Devi necessariamente scriverla come macro?
    Amaro C++, il gusto pieno dell'undefined behavior.

  3. #3
    Utente di HTML.it
    Registrato dal
    Mar 2012
    Messaggi
    214
    E' un esercizio per l'esame di sistemi operativi e nel capitolo relativo al preprocessing viene richiesto espressamente la risoluzione con una macro Sono confuso proprio per questo motivo, non so come utilizzare delle macro ricorsive, e neppure i manuali che ho consultato trattano questo argomento..

  4. #4
    Utente di HTML.it L'avatar di Scara95
    Registrato dal
    Jul 2009
    residenza
    Zimella (VR)
    Messaggi
    2,590
    Forse puoi fare qualcosa con l'operatore , (comma operator)...
    "Quid enim est, quod contra vim sine vi fieri possit?" - Cicerone, Ad Familiares

  5. #5
    Utente di HTML.it
    Registrato dal
    Mar 2012
    Messaggi
    214
    Mmm ok grazie per il suggerimento, andrò a documentarmi!

  6. #6
    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.

    Si può barare, 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.
    Amaro C++, il gusto pieno dell'undefined behavior.

  7. #7
    Utente di HTML.it
    Registrato dal
    Mar 2012
    Messaggi
    214
    Ti ringrazio per i due link, devo ammettere che non ho capito molto Comunque ti ringrazio, ci lavorerò su!

  8. #8
    Utente di HTML.it
    Registrato dal
    Mar 2012
    Messaggi
    214
    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:

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

  9. #9
    Utente di HTML.it
    Registrato dal
    Sep 2012
    Messaggi
    707
    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

  10. #10
    Utente di HTML.it
    Registrato dal
    Mar 2012
    Messaggi
    214
    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.

Permessi di invio

  • Non puoi inserire discussioni
  • Non puoi inserire repliche
  • Non puoi inserire allegati
  • Non puoi modificare i tuoi messaggi
  •  
Powered by vBulletin® Version 4.2.1
Copyright © 2024 vBulletin Solutions, Inc. All rights reserved.