expected primary expression before...?



  • Hallo zusammen bin ein Neuling im Bereich c++
    könnt ihr mir hierbei helfen: Es handelt sich um eine Funktion bmal
    die ich unten dann ausgeben möchte
    Wie man erkennen kann soll hier mit Brüchen gerechnet werden:

    #include <iostream>
    using namespace std;
    
    struct bruch {
    int zaehler;
    int nenner;
    };
    
    bruch bmal( bruch x, bruch y)
    {
    bruch erg;
    erg.zaehler=x.zaehler*x.nenner;
    erg.nenner=x.zaehler*x.nenner;
    
    return (erg);
    }
    
    int main () {
    
    struct bruch a;
    
    cout << "Geben sie zwei zahlen ein" << endl;
    cin >> a.zaehler;
    cin >> a.nenner;
    
    struct bruch b;
    
    cout << "Geben sie wieder zwei zahlen ein" << endl;
    cin >> b.zaehler >> b.nenner;
    
    cout << bmal(bruch a, bruch b) << endl;
    
    }
    

    folgedne Fehlermeldung bekomme ich
    expected primary expression before a
    expected primary expression before b

    bezieht sich auf das cout ganz am ende.
    😕

    Vielen Dank schon mal



  • Zeile 34: Du meintest bestimmt bmal(a, b).
    Dein nächstes Problem ist, dass cout nicht weiß wie man einen Bruch ausgibt. Entweder du bleibst dabei bruch.zaehler und bruch.nenner einzeln auszugeben oder du machst sowas komisches hier (geklaut von Scorcher24):

    ostream &operator<<(ostream &os, const bruch &b){
        os << b.zaehler<< '/' << b.nenner;
        return os;
    }
    


  • Es ist wohl schon ziemlich spät...
    Darf ich Dich an Deine eigene Funktion bplus() erinnnern:

    int bplus(bruch x, bruch y){
      //...
    }
    
    int main () {
      //.... 
    cout << bplus(opd1, opd2) << endl; // hier der Aufruf!
    }
    

    Ich hofffe Du erkennest, was Du diesmal anders gemacht hast, dass es nicht kompiliert...



  • leider erkenn ich es nicht..
    😞



  • Swoop schrieb:

    leider erkenn ich es nicht..
    😞

    Ich sach doch: es ist schon spät 😉

    a) cout << bplus(opd1, opd2) << endl;
    b) cout << bmal(bruch a, bruch b) << endl;
    

    Du hast da zweimal unnötig den Typen ( bruch ) mit angegeben.
    Das ist aber nur in der Signatur nötig, nicht beim Funktionsaufruf.

    nwp3 hat's auch geschrieben...



  • es ist wohl wirklich spät
    welcher bruch ist zu viel?

    #include <iostream>
    using namespace std;
    
    struct bruch {
    int zaehler;
    int nenner;
    };
    
    bruch bmal( bruch x, bruch y)
    {
    bruch erg;
    erg.zaehler=x.zaehler*x.nenner;
    erg.nenner=x.zaehler*x.nenner;
    
    return (erg);
    }
    
    int main () {
    
    bruch opd1 = {0,1};
    bruch opd2 = {0,1};
    
    cout << "Bitte geben Sie Zaehler und Nenner 1 ein:" << endl;
    cin >> opd1.zaehler >> opd1.nenner;
    
    cout << "Bitte geben Sie Zaehler und Nenner 2 ein:" << endl;
    cin >> opd2.zaehler >> opd2.nenner;
    
    cout << bmal(opd1, opd2) << endl;
    
    }
    


  • Jetzt ist's doch in Ordnung.

    Nur dass Du wie schon bemerkt wurde den operator<<() für die Ausgabe noch überladen musst - aber den kannst Du ja aus dem Posting von nwp3 oben einfach kopieren und kleben.



  • Axo:
    Wenn Dir das mit der Operatorüberladung zu suspekt ist schreib Dir doch einfach eine Funktion print() zum ausgeben.
    z.B.

    void print(const bruch& b, std::ostream& os){
      os << b.zaehler<< '/' << b.nenner << '\n';
    }
    
    int main(){
      bruch b;
      //...
      print(b, std::cout);
    }
    

    Gute Nacht 🙂



  • Habs jetzt so hin bekommen:

    #include <iostream>
    using namespace std;
    
    struct bruch {
    int zaehler;
    int nenner;
    };
    
    bruch bmal( bruch x, bruch y)
    {
    bruch erg;
    erg.zaehler=x.zaehler*x.zaehler;
    erg.nenner=x.nenner*y.nenner;
    
    return (erg);}
    
    int main () {
    
    bruch opd1 = {0,1};
    bruch opd2 = {0,1};
    
    cout << "Bitte geben Sie Zaehler und Nenner 1 ein:" << endl;
    cin >> opd1.zaehler >> opd1.nenner;
    
    cout << "Bitte geben Sie Zaehler und Nenner 2 ein:" << endl;
    cin >> opd2.zaehler >> opd2.nenner;
    
    bruch erg = bmal (opd1, opd2);
    cout << erg.zaehler << "/" << erg.nenner << endl;
    
    }
    

    🙂 🙂 🙂 🙂


Anmelden zum Antworten