Funktion mit Referenzen realisieren



  • Hallo zusammen,
    ich habe eine Funktion geschrieben,
    welche aus einem String zwei Zahlen rausfiltert und diese dann addiert. Würde jetzt gerne diese Funktion mit Referenzen realisieren. Wenn man mit Referenzen arbeiten möchte muss man ja die Funktion so schreiben

    int sum_reference(std::string& text){}
    

    Habe die Funktion schon ohne Referenzen realisiert, nun möchte ich sie mit Referenzen realisieren. Das einzigste was ich vorgenommen hatte war das hinzufügen des '&' bei der Funktion. Und dann kommt es zu einer Fehlermeldung.(diese unten aufgezeigt ist)

    Die Überhabe einer Variablen in die Funktion (mit Referenz, wie das obige Code-Fragment) sorgt doch dafür, dass die übergebene und Funktionsvariable die gleiche Speicheradresse haben. Zudem Frage ich mich wie ich die Rückgabe (return result) realisiere.

    Die Fehlermeldung die ich bekommen habe sieht so aus:

    libc++abi: terminating with uncaught exception of type std::out_of_range: basic_string

    (ich nutze CLion)

    Kann mir da jemand weiterhelfen?
    Gruß John

    Hier der Code:

    
    int sum(std::string text){
       std::string backup_text = text;
        int plus_location = text.find('+');
    
        text.erase(plus_location,text.size() );             // Filterung der Zahl 1
        std::stringstream ss(text);                         // string Fragment 1 in int umwandeln
        int num1;
        ss >> num1;
    
        backup_text.erase(0, plus_location+1);      // Filterung der Zahl 2
        std::stringstream ss1(backup_text);                 // string Fragment 2 in int umwandeln
        int num2;
        ss1 >> num2;
    
        int result = num1 + num2;                           //Ergebnis Berechnung von num1 & num2
        return result;
    }


  • @Johnny01 sagte in Funktion mit Referenzen realisieren:

    Hallo zusammen,
    ich habe eine Funktion geschrieben,
    welche aus einem String zwei Zahlen rausfiltert und diese dann addiert. Würde jetzt gerne diese Funktion mit Referenzen realisieren. Allerdings treten hierbei Fehler auf.

    Welche?



  • @Johnny01 sagte in Funktion mit Referenzen realisieren:

    Allerdings treten hierbei Fehler auf.

    1. Formatier´ deinen Quelltext bitte mit den Code-Tags. Das wurde dir in deinem letzten Post auch schon gesagt, Warum sollten sich andere Leute Mühe geben, deine Frage zu beantworten, wenn du dir schon keine Mühe beim Stellen der Frage gibst?

    2. Welche Fehler treten denn auf? Bitte die Fehlermeldungen per Copy & Paste einstellen.



  • @DocShoe habe meine Frage überarbeitet. Hoffe meine Formatierung passt jetzt.



  • Wenn dann solltest du eine nicht-konstante Referenz const std::string& benutzen, da der String innerhalb der Funktion nur gelesen wird (und nicht verändert).

    Und die Exception kommt, weil du den Rückgabewert von text.find('+') nicht überprüfst, ob das Zeichen überhaupt vorkommt (s. std::basic_string::find). Oder mit welchem Text rufst du die Funktion auf?

    PS: Dein Code geht kürzer und eleganter...



  • Sehr schön.

    std::string::erase erwartet einen iterator, keinen Index. Ein iterator ist eine Art Zeiger, die eine Position in einem container identifiziert. plus_location und 0 sind keine gültigen iteratoren, bei deren Benutzung greifst du auf ungültigen Speicher und daraus resultiert dein Fehler. Das hat mit Referenzen jetzt nichts zu tun. Schnapp´ dir dein C++ Lehrbuch und such das Kapitel, das sich mit der STL und dem iteratoren-Konzept befasst.



  • @DocShoe: Dann hast du wohl nicht richtig in der Referenz geschaut: std::basic_string::erase (gleich die erste Überladung ;- )



  • Wenn du mit stringstreams arbeiten willst (das könnte man in Frage stellen wollen), dann geht dein Code einfacher:

    int rechnen(const std::string &text) {
        std::stringstream ss(text);
        int a, b;
        char op;
        if (ss >> a >> op >> b) {  // hier versucht man zahl, zeichen und zahl aus ss zu lesen
           if (op == '+') return a + b;
           if (op == '-') return a - b;
           throw runtime_error("Ungültiger Operator");
        }
        throw  runtime_error("Ungültiges Format");
    }
    


  • @Th69

    Tatsächlich, war mir nicht bekannt. o.O