Problema con le macro, aiuto!

di il
11 risposte

Problema con le macro, aiuto!

Sono un principiante e aspirante programmatore , per imparare sto seguendo il libro IL LINGUAGGIO C di Brian w. Kernighan e Dennis m. Richtie (secondo voi è un buon inizio? se avete consigli dite pure ),
comunque avrei un problema con le macro nelle prove che sto facendo
il problema sta nella chiamata della macro, xcode mi dice: use of undeclared identifier "x" e lo stesso per "y" (ignorate i commenti che sono solo appunti):


//ecco una direttiva
#include <stdio.h>
//ecco una costante
#define P_GRECO 3.14
//ecco una macro
//le macro sono molto simili alle funzioni
#define FORMULA_AREA_CERCHIO (x, y) (x * x * y)

int main(int argc, const char * argv[])
{

float raggio = 5.2, areaCerchio;
areaCerchio = FORMULA_AREA_CERCHIO (raggio, P_GRECO);
return 0;
}

cosa devo fare?

11 Risposte

  • Re: Problema con le macro, aiuto!

    Non devi mettere lo spazio fra il nome della macro e i suoi parametri, quindi scrivi
    #define FORMULA_AREA_CERCHIO(x, y) (x * x * y)
    se ci ragioni sopra capirai il perchè.
    Comunque ti sconsiglio vivamente di utilizzare macro
  • Re: Problema con le macro, aiuto!

    Ok, grazie per la risposta comunque c'è un motivo preciso per non utilizzare le macro? forse è meglio usare le funzioni?
  • Re: Problema con le macro, aiuto!

    Principalmente con le macro non hai controlli sui tipi (quindi non fanno differenza se passi un float oppure un int) e spesso portano ad errori difficilmente rintracciabili.
    In passato le MACRO venivano utilizzate perchè rendevano il programma più veloce (rispetto ad una funzione non vi è l'utilizzo dello stack) a scapito però delle dimensioni dell'eseguibile. Al giorno d'oggi il problema non si pone più (a meno di lavorare con un microcontrollore con risorse e velocità limitate).
    Se non vuoi diventare matto evita le MACRO! Piuttosto, esercitati per bene nella scrittura di funzioni e nel loro utilizzo.
  • Re: Problema con le macro, aiuto!

    Grazie mille!
  • Re: Problema con le macro, aiuto!

    Nel tuo caso io avrei scritto
    #include <stdio.h>
    
    #define P_GRECO 3.14
    
    float AreaCerchio(float raggio)
    {
       return P_GRECO*raggio*raggio;
    }
    
    int main(int argc, const char * argv[])
    {
       float raggio = 5.2, area;
       area = AreaCerchio (raggio);
       return 0;
    }
  • Re: Problema con le macro, aiuto!

    Oky , in effetti le funzioni sono anche un po' più semplici, almeno per come le vedo
  • Re: Problema con le macro, aiuto!

    Grazie alla non "tipizzazione" delle macro si possono creare pseudo funzioni adattabili a quasi tutti i tipi senza dover riscrivere la stessa funzione piu e piu volte:
    
    #define MAX(A,B) (((A)>(B))?A:B)
    
    Ma sicuramente possono portare a incomprensibili frammenti di codice.
    Insomma vanno usate con parsimonia e solo quando realmente necessarie.
  • Re: Problema con le macro, aiuto!

    Scusate se chiedo un'altra volta, mi dispiace, ma quando provo ad usare questa funzione mi appaiono due errori che non avevo mai visto prima:

    "_formulaAreaQuadrato", referenced from:
    _main in main.o
    ld: symbol(s) not found for architecture x86_64

    e

    clang: error: linker command failed with exit code 1 (use -v to see invocation)

    questo è il codice:
    #include <stdio.h>
    
    #define P_GRECO 3.14
    
    #define FORMULA_AREA_CERCHIO(x, y) (x * x * y)
    
    float raggio = 5.2, formulaAreaQuadrato(float x);
    static float nomeVariabile;
    
    int main(int argc, const char * argv[])
    {
        float p2Circonferenza = raggio * 2 * P_GRECO, areaCerchio, lato = 3.7, p2Quadrato = lato * 4, areaQuadrato;
        extern float raggio;
        
        areaCerchio = FORMULA_AREA_CERCHIO (raggio, P_GRECO);
        areaQuadrato = formulaAreaQuadrato(lato);
        printf("2Pc=%f\nAc=%f\n2Pq=%f\nAq=%f", p2Circonferenza, areaCerchio, p2Quadrato, areaQuadrato);
        return 0;
    }
    
    
    float formuaAreaQuadrato(float x)
    {
        return x * x;
    }
    
  • Re: Problema con le macro, aiuto!

    Le faccine ce le dobbiamo mettere noi
    float raggio = 5.2, formulaAreaQuadrato(float x);
    qui hai mischiato la definizione e inizializzazione di una variabile globale con un prototipo di funzione!
    Scrivi
    float raggio = 5.2;
    float formulaAreaQuadrato(float x);
    altrimenti il compilatore crede che formulaAreaQuadrato sia una variabile!
    ...e attenzione che poi la funzione l'hai chiamata formuaAreaQuadrato...
  • Re: Problema con le macro, aiuto!

    Ops lol, ve l'ho detto che sono un principiante
  • Re: Problema con le macro, aiuto!

    Puoi chiamarla anche xywrok, l'importante che quando la chiami utilizzi lo stesso nome: tu chiamavi formulaAreaQuadrato e invece avevi definito formuaAreaQuadrato
Devi accedere o registrarti per scrivere nel forum
11 risposte