stringstream und bus error.. ich werd noch wahnsinnig ;)



  • Hello World,

    ich habe nun seit einiger Zeit an folgendem im Grunde total simplen Poblem zu knacken: Um eine Hash-Map sinnvoll zu fuellen habe ich eine Methode geschrieben, die aus zwei int keys einen string erzeugen soll. Also test(3,4) liefert den string "3:4" zurueck. Soweit sogut.

    std::string HashMapWrap::test(int key1, int key2) {
        std::stringstream stream;
        stream << key1 << ":" << key2;
        std::string s = stream.str();
        return s;
    }
    

    wenn ich das ganze aufrufe mit einem simplen:

    HashMapWrap hm();
    std::cout << hm.test(1,2);
    

    bekomme ich immer einen Bus error.

    Nun kommt was mich noch mehr wundert: Wenn ich folgendes schreibe geht alles:

    std::string HashMapWrap::test2() {
        return "test";
    }
    

    ABER wenn ich z.B. das hier hinzufuege:

    std::string HashMapWrap::test2() {
        std::stringstream s1;
        std::cout <<"1\n";
        int i = 22;
        s1 << "testMethod " << i;
        std::cout <<"2\n";
        std::string s2 = s1.str();
        std::cout <<"3\n";
    
        return "test";
    }
    

    fliegt mir wieder ein 'bus error' an den Kopf. Vorher aber gibt er noch 1,2 und 3 aus. Was ich nun nicht verstehe ist

    1. wenn ich alles bis hin zur 3 sehe, sollte der code darueber keinen Error schmeissen, oder?
    2. der Code ueber der Rueckgabe beeinflusst die Methode in keinster Weise, trotzdem bekomme ich mit ihm den fehler, ohne aber nicht.
    3. Der Code der nun also anscheinend die Fehler produziert (der stringstreamkram) funktioniert als solches wunderbar in der main()-Methode aber nicht in der Member-Methode..

    Das macht alles keinen Sinn, wo liegt mein Fehler? Bitte klaert mich auf!

    Danke Danke
    viele Gruesse



  • Also leider bin ich noch ziemlich unerfahren mit C++ etc, und deshalb hier der Code der in der in der anderen Datei die Fehler aufwirft..

    Hat jemand eine Idee? Ich verstehe das ganze nun wirklich nicht mehr... Ich bin echt ratlos (und doktere nun schon den ganzen Tag an diesem Fehler rum)...

    Vielleicht hat ja doch jemand seine Kristallkugel dabei?

    Meine main.cpp:

    #include <string>
    #include <sstream>
    #include "HashMapWrap.h"
    
    using namespace Tribots;
    
    int main (int argc, char * const argv[]) {
    
        HashMapWrap hm(20);
    
        std::cout << hm.test(); 
        return 0;
    }
    

    Und hier die andere Klasse: HashMapWrap.h

    #include "hash_map.h"
    #include <string>
    
    class HashMapWrap {
    
    struct eqstr {
        bool operator()(const char* s1, const char* s2) const{
        return strcmp(s1, s2) == 0;
        }
    };
    
    public:
        HashMapWrap::HashMapWrap(int initSize);
        HashMapWrap::HashMapWrap();
        HashMapWrap::~HashMapWrap();
    
        float getValue(int key1, int key2);
        void setValue(int key1, int key2, float value);
    
        void resize(int i);
        int size();
    
        std::string makeStringFromKeys(int key1, int key2);
        std::string test();
    
    private:
        hash_map<const char*, float, hash<const char*>, eqstr> connections;
    };
    

    und die passende .cpp datei:

    /*
     *  HashMapWrap.cpp
     *  dynObjRec
     *
     *  Created by Tim Kietzmann on 15.06.06.
     *  Copyright 2006 __MyCompanyName__. All rights reserved.
     *
     */
    
    #include "HashMapWrap.h"
    #include <sstream>
    
    HashMapWrap::HashMapWrap() {
    }
    
    HashMapWrap::HashMapWrap(int initSize) {
        connections.resize(initSize);
    }
    
    HashMapWrap::~HashMapWrap() {
    }
    
    float HashMapWrap::getValue(int key1,int key2) {
        return connections[makeStringFromKeys(key1,key2).c_str()];
    }
    
    void HashMapWrap::setValue(int key1,int key2,float value) {
        connections[makeStringFromKeys(key1,key2).c_str()] = value;
    }
    
    void HashMapWrap::resize(int initSize) {
        connections.resize(initSize);
    }
    
    int HashMapWrap::size() {
        return connections.size();
    }
    
    std::string HashMapWrap::makeStringFromKeys(int key1, int key2) {
        std::ostringstream os;
        os << key1 << ":" << key2;
        std::string s = os.str();
        return s;
    }
    
    std::string HashMapWrap::test() {
        std::stringstream s1;
        std::cout <<"1\n";
        int i = 22;
        s1 << "testMethod " << i;
        std::cout <<"2\n";
        std::string s2 = s1.str();
        std::cout <<"3\n";
        s1.flush();
        s1.clear();
    
        return "test";
    }
    

    Ich hoffe dass dieser Code nun fuer etwas mehr Klarheit sorgt, ich hatte vorhin nur Code-Schnipsel hinzugefuegt um euch die lesearbeit zu ersparen..

    Die test() methode ist die die ich oben auch beschrieben habe, und die makeStringFromFile ebenfalls 😉

    Danke euch!


  • Mod

    und die definition von hash_map?



  • Die Klasse hash_map.h ist im GNU ISO C++ Library (also auch standartmaessig im gcc (g++ 4.0.0)) vorhanden..

    Hier sind die deklaration und implementation (hoffe ich)

    http://web350.server15.greatnet.de/hash_map.h
    http://web350.server15.greatnet.de/hash_map



  • Also das Problem ist auch vorhanden wenn man die Zeilen mit HashMap auskommentiert..

    Hier eine neue Version, aber gleicher Fehler:

    HashMapWrap.h:

    #include <string>
    
    class HashMapWrap {
    
    struct eqstr {
        bool operator()(const char* s1, const char* s2) const{
        return strcmp(s1, s2) == 0;
        }
    };
    
    public:
        HashMapWrap::HashMapWrap(int initSize);
        HashMapWrap::HashMapWrap();
        HashMapWrap::~HashMapWrap();
    
        float getValue(int key1, int key2);
        void setValue(int key1, int key2, float value);
    
        void resize(int i);
        int size();
    
        std::string makeStringFromKeys(int key1, int key2);
        std::string test();
    
    private:
        //hash_map<const char*, float, hash<const char*>, eqstr> connections;
    };
    

    und die .cpp datei:

    /*
     *  HashMapWrap.cpp
     *  dynObjRec
     *
     *  Created by Tim Kietzmann on 15.06.06.
     *  Copyright 2006 __MyCompanyName__. All rights reserved.
     *
     */
    
    #include "HashMapWrap.h"
    #include <sstream>
    
    HashMapWrap::HashMapWrap() {
    }
    
    HashMapWrap::HashMapWrap(int initSize) {
       // connections.resize(initSize);
    }
    
    HashMapWrap::~HashMapWrap() {
    }
    
    float HashMapWrap::getValue(int key1,int key2) {
        return 0;//connections[makeStringFromKeys(key1,key2).c_str()];
    }
    
    void HashMapWrap::setValue(int key1,int key2,float value) {
        //connections[makeStringFromKeys(key1,key2).c_str()] = value;
    }
    
    void HashMapWrap::resize(int initSize) {
       // connections.resize(initSize);
    }
    
    int HashMapWrap::size() {
        return 0;//connections.size();
    }
    
    std::string HashMapWrap::makeStringFromKeys(int key1, int key2) {
        std::ostringstream os;
        os << key1 << ":" << key2;
        std::string s = os.str();
        return s;
    }
    
    std::string HashMapWrap::test() {
        std::stringstream s1;
        std::cout <<"1\n";
        int i = 22;
        s1 << "testMethod " << i;
        std::cout <<"2\n";
        std::string s2 = s1.str();
        std::cout <<"3\n";
        s1.flush();
        s1.clear();
    
        return "test";
    }
    

    main.cpp:

    #include <string>
    #include <sstream>
    #include "HashMapWrap.h"
    
    using namespace Tribots;
    
    int main (int argc, char * const argv[]) {
    
        HashMapWrap hm(20);
    
        std::cout << hm.test();
        std::cout << hm.makeStringFromKeys(1,2); 
        return 0;
    }
    

    beide Methoden schmeissen mri den Bus error an den Kopf!

    Gruesse



  • Wie weit kommt denn die test() Methode, bevor sie dich mit einem "Bus Error" überrascht?

    (btw, wenn die Methode nichts mit der internen Datenstruktur zu tun hast, reicht dort auch eine statische Memberfunktion (oder eine unabhängige Funktion)



  • Er gibt alles aus, also 1,2 und 3.

    Ihr koennt euch uebrigens die zeilen
    s1.flush();
    s1.clear();
    einfach wegdenken, mit und ohne kommt der Fehler!

    Das bescheuerte ist dass wenn die Zeilen vorhanden sind er den Bus error NACH der Ausgabe von 3 macht also wohl beim return. Wenn ich aber die zeilen loesche kommt kein bus error.

    Ich finde das ganze sehr merkwuerdig, weil er im ersten Fall den Code anscheinend durchlaeuft ohne Problem und der Fehler beim return kommt und der zweite Fall zeigt dass das return alleine ohne probleme funktioniert..

    Es ist zum Haare raufen..

    Danke fuer eure Hilfe schon und noch einmal...



  • Sry das ich frage, aber was ist ein "Bus Error"?

    Also bei mir lässt sich das Beispiel wunderbar durchlaufen. Ausgabe:

    1
    2
    3
    test1:2
    

    mfg.


  • Mod

    joomoo schrieb:

    Sry das ich frage, aber was ist ein "Bus Error"?

    Also bei mir lässt sich das Beispiel wunderbar durchlaufen. Ausgabe:

    1
    2
    3
    test1:2
    

    mfg.

    natürlich. ist ja auch nichts dran. ich würde vermuten, das problem ist in der build-umgebung und nicht im source zu suchen. irgendein treiber, der probleme macht, viren, hardwaredefekte, was auch immer.



  • also ich habe den compiler von g++3.3 auf 4.0 umgestellt, nun cshien vorerst das problem nicht zo bestehen.. bis gerade eben. Ich habe nichts am code geaendert und auf einmal funktioniert wieder nichts. So eine sch*****! Ich versuche das ganze morgen unter Linux.. ich sitze nun fast ne woche an dieser scheiss klasse..etwas was ich in 3 anderen sprachen innerhalb von stunden geschrieben haette dauert fuer mich in c++ tage 😢

    Habe da nun eine Frage zum Code an sich:
    ich habe in der makeStringFromKeys-Methode ein string objekt angelegt, welches mit inhalt gefuellt wird. Dieses string-objekt wird dann zurueckgegeben als return der Methode. Kann man das ueberhaupt so machen oder geht das objekt ausserhalb des scopes verloren (weil ja nur lokale variable)? Sollte ich also besser mit new arbeiten und einen string pointer zurueckgeben?

    Danke schon einmal...


Anmelden zum Antworten