Frage zur Übergabe eines Makros als Parameter



  • Hey Leute,
    wollt mal fragen ob ich an eine Funktion als Parameter auch ein makro übergeben kann???

    Beispiel:
    #define Cube(x) ( (x) * (x) )

    int b = 5;

    eineFunktion(int a,int Cube(b))
    {
    }

    danke schonmal;-)



  • ja sicher aber in dem speziellen fall gehts nicht, solltest du aber deine 2 busen so rein packen...

    #define Cube(x) ( (x) * (x) )
    void myFn(int x){
      printf("%d",x);
    }
    int main(void){
      myFn(Cube(2));
    }
    

    sowas geht auch

    #define TP(x,y) x y
    void myFn(TP(int,x)){
      printf("%d",x);
    }
    int main(void){
      myFn(2);
    }
    

    obs sinn macht ist mir jetzt mal gleich 😉

    lg lolo



  • fr33g schrieb:

    Hey Leute,
    wollt mal fragen ob ich an eine Funktion als Parameter auch ein makro übergeben kann???

    Nein, das geht nicht. Makros sind eine reine Textersetzung, du musst also schauen, durch was dein Makro ersetzt wird und dann fragen, ob du *das* an die Funktion übergeben kannst.



  • Ok, danke jetzt weiß ich bescheid=)

    Hab ma noch ne frage, passt hier zwar net rein, aber wollt jetzt au net extra nen thread aufmachen.

    und zwar, ich hab mir eine Klasse geschrieben z.B. auto.

    so jetzt will ich ein neues auto objekt erstellen.

    vorher hat der benutzer durch eine eingabe den namen in einem string gespeichert.

    also z.b:

    cout << "Autonamen";
    string autoname;
    cin >> autoname;

    kann ich jetzt mit
    auto "autoname" ein objekt auto erstellen, so dass ich dies dann in einer map speichern kann?

    map Autos[autoname] = autoname;

    hoffe ihr versteht was ich meine;-)

    danke schonmal



  • Ja, aber benenne deine Klasse nicht nach reservierten Schlüsselwörtern der Sprache.

    Als assoziativen Container könntest du std::map verwenden. Eine Einführung findest du hier, als Nachschlagewerk ist www.cplusplus.com zu empfehlen.



  • also ich hab jetzt mal folgendes probiert, klappt aber irgendwie nicht.

    main.cpp

    #include "classAdressen.h"
    #include <iostream>
    #include <string>
    #include <fstream>
    #include <map>
    using namespace std;
    
    void auslesen(map<string, Adressen>);
    void einlesen(map<string, Adressen>);
    
    int main()
    {
        map<string, Adressen> Daten;
    
        int choice;
        bool stop = false;
        bool stop2 = false;
    
        while(true)
        {
            marke:;
            cout << "Wollen sie eine Adresse speichern(1)oder nicht(2)?";
            cin >> choice;
    
            if (choice == 2)
                stop = true;
            else if( (choice != 2) && (choice != 1) )
            {
                cout << "Falsche Eingabe\n";
                goto marke;
            }
    
            while (stop == true)
            {
                marke2:;
                cout << "Wollen sie Adressen auslesen(1) oder beenden(2)?";
                cin >> choice;
    
                if (choice == 2)
                {
                    stop2 = true;
                    break;
                }
                else if( (choice != 2) && (choice != 1) )
                {
                    cout << "Falsche Eingabe\n";
                    goto marke2;
                }
    
                auslesen(Daten);
    
            }
            if (stop2 == true)
                break;
    
            einlesen(Daten);
    
        }
    
    }
    
    void auslesen(map<string, Adressen> Daten)
    {
        string vorname;
        cout << "Welche Adresse wollen sie auslesen(Vorname): ";
        cin >> vorname;
    
        cout << Daten[vorname].getVor_name();
        cout << Daten[vorname].getNach_name();
        cout << Daten[vorname].getAdresse();
        cout << Daten[vorname].getTele();
    
    }
    
    void einlesen(map<string, Adressen> Daten)
    {
        cout << "Geben sie den Vornamen ein: ";
        string vor_name;
        cin >> vor_name;
    
        cout << "Geben sie den Nachname ein: ";
        string nach_name;
        cin >> nach_name;
    
        cout << "Geben sie die Adresse ein: ";
        string adresse;
        cin.ignore();
        getline(cin,adresse);
    
        cout << "Geben sie die Telefonnummer ein: ";
        string tele;
        cin >> tele;
    
        Daten[vor_name] = new Adressen(vor_name, nach_name, adresse, tele);
    
    }
    

    classAdressen.h

    #include <string>
    
    #ifndef CLASSADRESSEN_H_INCLUDED
    #define CLASSADRESSEN_H_INCLUDED
    
    class Adressen
    {
        public:
            Adressen(){}
            Adressen(std::string vorname, std::string nachname, std::string adresse, std::string tele):
                itsVor_name(vorname), itsNach_name(nachname), itsAdresse(adresse), itsTele(tele) {};
            ~Adressen(){};
            void setVor_name(std::string&);
            void setNach_name(std::string&);
            void setAdresse(std::string&);
            void setTele(std::string&);
            std::string getVor_name()const{return itsVor_name;}
            std::string getNach_name()const{return itsNach_name;}
            std::string getAdresse()const{return itsAdresse;}
            std::string getTele()const{return itsTele;}
    
        private:
            std::string itsVor_name;
            std::string itsNach_name;
            std::string itsAdresse;
            std::string itsTele;
    };
    
    #endif // CLASSADRESSEN_H_INCLUDED
    

    classAdressen.cpp

    #include "classAdressen.h"
    #include <iostream>
    #include <string>
    
    using namespace std;
    
    void Adressen::setVor_name(string &vor_name)
    {
        itsVor_name=vor_name;
    }
    
    void Adressen::setNach_name(string &nach_name)
    {
        itsNach_name=nach_name;
    }
    
    void Adressen::setAdresse(string &adresse)
    {
        itsAdresse=adresse;
    }
    
    void Adressen::setTele(string &tele)
    {
        itsTele=tele;
    }
    

    ich bekomm jedoch immer den fehler:
    no match for operator= in......

    hoffe ihr könnt mir helfen=)



  • Bei so viel Code solltest du sagen, wo der Fehler auftritt, oder gleich nur den relevanten Teil posten.

    Aber verwende kein goto ! Dessen Anwendung ist nur in sehr sehr wenigen Fällen berechtigt.



  • ja das mit dem goto muss ich mir echt abgewöhnen:(

    der fehler ist in der main, ganz unten wo steht
    Daten[vor_name] = new Adressen....

    hoffe ihr findet den fehler=)



  • Du weist den falschen Typ zu. Deklariert ist

    map<string, Adressen>
    

    , du willst den Container aber wie

    map<string, Adressen*>
    

    benutzen (schliesslich gibt new einen Zeiger zurück). Und das ist keine gute Idee! Vermeide new , wenn es nicht nötig ist.

    In deinem Fall reicht ein

    Daten[vor_name] = Adressen(vor_name, nach_name, adresse, tele);
    

    P.S. Ich würde mir eine vernünftige Namenskonvention aussuchen und diese konsequent durchziehen. Aber sowas wie "getVor_name" ist schrecklich. 😉
    Die verbreitetsten Formen sind wohl "getVorname", "GetVorname" und "get_vorname".

    Ach ja, nochwas: Übergib Container im Allgemeinen nicht als Kopie wie z.B. hier:

    void einlesen(map<string, Adressen>);
    

    Referenzen, wenn angebracht auf konstante Objekte, sind das Stichwort. Je nachdem auch Zeiger.



  • Ok danke schonmal, werxs heute nachmittag mal probieren. Mein aber das schon probiert zu habenjedoch ohne erfolg. Probiers aber nochmal und meld mich;-)



  • Ein bisschen allgemeines zum Code:
    1. statt goto ist hier continue angebrachter, damit entfällt auch die Sprungmarke.
    2. stop == true ist doppelt gemoppelt (ist es wahr, dass stop wahr ist?), while(stop) tut's auch.
    3. die beiden Schleifen wären in eigenen Funktionen besser aufgehoben. So wird jetzt der Fall choice==1 von oben ganz am Ende abgehandelt und die andere Schleife ist da noch dazwischen 😮
    Das trägt nicht viel zur Übersichtlichkeit bei.
    4. Wenn Adressen eine einzelne Adresse ist, sollte der Name am besten auch wiederspiegeln. Unter Adressen würde ich mir einen Adressencontainer oder sowas vorstellen...
    5. Hat Nexus schon gesagt: den Container unbedingt als Referenz übergeben, denn sonst wird er jedesmal kopiert, was a) teuer ist und b) dazu führt, dass die neue Adresse nie im Originalcontainer landet.



  • Hey, danke hab es jetzt hinbekommen=)


Anmelden zum Antworten