Problem mit map



  • Hallo zusammen!

    Habe da ein Problem mit einer map bzw. genauer gesagt dem Umwandeln ihrer Werte von String nach Integer. Habe bereits die FAQ gelesen und auch alles proboiert, komme aber trotzdem nicht weiter.

    So sieht die Map aus (wie hier im Forum schon beschrieben:

    //config.h
    static std::map<std::string, std::string>  Values;
    

    Nun moechte ich die Werte der Schluessel in Integer konvertieren;

    const char* Apu = Values["ApuState"];
    int Electric::ApuState = atoi(Apu);
    

    Leider funktioniert das nicht, hier der Compiler-Error:

    h:\users\sven\documents\visual studio 2005\projects\teamtripleseven\tts_b777_gau\electric.cpp(8) :
     error C2440: 'initializing' : cannot convert from 'std::basic_string<_Elem,_Traits,_Ax>' to 'const char *'
            with
            [
                _Elem=char,
                _Traits=std::char_traits<char>,
                _Ax=std::allocator<char>
            ]
            No user-defined-conversion operator available that can perform this conversion, or the operator cannot be called
    

    Habe auch die anderen Varianten (stringstream etc.) probiert, alle mit dem gleichen Ergebnis. Bin noch ein echter Newbie und waere fuer Hilfe dankbar.

    Benutze Visual C++ 2005 Express

    Viele Gruesse
    Sven



  • Wenn da auch wirklich immer ein int drin steht, könntest du ja gleich eine std::map<std::string, int> nehmen?!

    Naja du suchst auf jeden Fall für dein Problem den FAQ-Beitrag "einmal von Zahl nach String und zurück".

    MfG SideWinder



  • const char* Apu = Values["ApuState"].c_str();
    int Electric::ApuState = atoi(Apu);
    


  • @SideWinder,

    gleich map<string, int> geht nicht da ich die Schluesselpaare aus einer Textdatei auslese. Und Den FAQ-Bereich hatte ich ja durchgearbeitet (daher wusste ich ueberhaupt von der Funktion).

    @Konrad,

    Vielen Dank :-). Wenn Du bzw. jemand anderes mir noch erklaeren warum dieses ".cstr()" dahinterstehen muss waere ich uebergluecklich. Mit den MSDN-Docs tu ich mich in einigen Sachen noch recht schwer.

    Viele Gruesse
    Sven



  • schwudde schrieb:

    Wenn Du bzw. jemand anderes mir noch erklaeren warum dieses ".cstr()" dahinterstehen muss waere ich uebergluecklich.

    Du willst ein 'const char ' haben, in der map sind aber 'std::string'-Objekte gespeichert. Man kann zwar 'const char' implizit in 'std::string' konvertieren aber umgekehrt geht es eben nicht. Dafür stellt 'std::string' aber die Methode 'c_str' bereit, welche einen Zeiger auf die Zeichenkette als 'const char*' zurückgibt -- genau das, was wir hier brauchen.

    -- allerdings bevorzuge ich in C++ Stringstreams zum Konvertieren zwischen Zahlen und Text. 'atoi' klappt zwar aber die Ensprechung 'itoa' hat jede Menge Probleme.



  • Würde zwar auch Stringstreams als "C++-Way" bevorzugen, aber welche Probleme hat itoa?

    BTW: Der Hammer ist natürlich boost::lexical_cast

    MfG SideWinder



  • SideWinder schrieb:

    Würde zwar auch Stringstreams als "C++-Way" bevorzugen, aber welche Probleme hat itoa?

    Man muss dafür sorgen, dass der Puffer ausreichend groß ist. Das ist für jeden übersichtlichen Quelltext ein *enormes* Problem. Gerade hier ist C++' Stärke doch, solche Verwaltungscodes zuverstecken. Wenn man mit 'itoa' arbeitet, ist es nicht möglich, den Verwaltungscode zu verstecken.

    BTW: Der Hammer ist natürlich boost::lexical_cast

    Ja. Aber das ist ja auch nur ein stringstream mit zwei zusätzlichen Tests um sicherzustellen, dass die gesamte Eingabe angenommen und verwertet wurde. Außerdem gefällt mir die Architektur eines lexikalischen Cast eigentlich nicht, denn es wird hier so getan, als seien Quelle und Ziel "gleiche" Parter, die nur über einen Interpreter ineinander umgewandelt werden. Ich halte diese Interpretation für fragwürdig. Ich finde es sinnvoller, von einem int (oder was auch auch immer) als "Wert" zu denken und von der entsprechenden String-Interpretation eben als "Interpretation" bzw. "Repräsentation". Das wird durch 'lexical_cast' nicht ausgedrückt. Hier finde ich Haskells 'Show'-Semantik besser.

    (Ja, mir ist bewusst, dass das total OT ist aber für solche Diskussionen sind Boards doch da.)



  • Vielen Dank fuer die Antworten. Jetzt ist mir wieder was klarer geworden 🙂

    Viele Gruesse
    Sven



  • schwudde schrieb:

    gleich map<string, int> geht nicht da ich die Schluesselpaare aus einer Textdatei auslese.

    Da ist es vielleicht besser, den Wert direkt beim Einlesen in einen int umzuwandeln 😉 (bei jeder Verwendung erstmal atoi() aufzurufen kostet nur unnötig Rechenzeit)



  • CStoll schrieb:

    schwudde schrieb:

    gleich map<string, int> geht nicht da ich die Schluesselpaare aus einer Textdatei auslese.

    Da ist es vielleicht besser, den Wert direkt beim Einlesen in einen int umzuwandeln ;)...

    Zumal man evtl. schon bei der Eingabe wissen möchte, dass man eine falsche Eingabe gemacht hat. 😃

    Für mich einer der großen Vorteile von den IStreams gegenüber atoi(): Eine falsche Eingabe fällt direkt auf - atoi() liefert einfach 0 ... und dann muß man sich überlegen, ob wirklich einen 0 gemeint war, oder "Hugo" eingegeben wurde.

    Gruß,

    Simon2.


Anmelden zum Antworten