Speicheradresse zu String


  • Mod

    Bashar schrieb:

    Ohne es jetzt ausprobiert zu haben: Brauchen wir keinen lvalue auf der linken Seite vom operator<<?

    Das temporäre Objekt ist ja nicht konstant. Das ist doch diese komische Sonderklausel, die genau solche Konstrukte erlaubt.

    @Hacker: Ich hoffe, du hast inzwischen ausprobiert und herausgefunden, dass du richtig rum gedacht hast 🙂 . Dummerweise funktioniert beides nicht, da am Ende kein stringstream mehr rauskommt.



  • Funktioniert das so denn überhaupt? operator<< gibt hier doch einen std::ostream zurück, und der bietet die Methode str() doch gar nicht an, oder?

    Edit: Zu spät.



  • SeppJ schrieb:

    Bashar schrieb:

    Ohne es jetzt ausprobiert zu haben: Brauchen wir keinen lvalue auf der linken Seite vom operator<<?

    Das temporäre Objekt ist ja nicht konstant. Das ist doch diese komische Sonderklausel, die genau solche Konstrukte erlaubt.

    Meinst du weil der operator<< in dem Fall eine Memberfunktion ist? Wusste ich gar nicht, und jetzt kommt mir diese Klausel auch ziemlich unlogisch vor.


  • Mod

    Bashar schrieb:

    Meinst du weil der operator<< in dem Fall eine Memberfunktion ist?

    Ja.

    Wusste ich gar nicht, und jetzt kommt mir diese Klausel auch ziemlich unlogisch vor.

    Ja, die ist ein bisschen komisch.



  • Ja, aber das zurück gegebene ostream-Objekt lässt sich wieder zurückcasten, oder? 🤡
    Edit: Nein, zur Not wird einfach eine Instanz erzeugt und es wird alles separat getan (und man macht statt einer eben drei Zeilen -.-).

    SeppJ schrieb:

    Hacker schrieb:

    Muss doch ein ostringstream sein?

    Rate doch mal, wer von euch beiden wohl Recht hat. Und dann probier's zur Sicherheit nochmal aus.

    Ich dachte, Mac-User machen nie was falsch, und der Computer hat ein eingebautes Erkennungssystem dass jeglichen unschönen oder gar falschen Code oder unschönes Design automatisch durch das bestmögliche ersetzt...



  • Das funktioniert:

    #include <iostream>
    #include <sstream>
    using namespace std;
    
    int f=1;
    
    class var
    {
    
    };
    
    ostream &operator<< (ostream &os, var &v )
    {
            return os<< &f ;
    }
    
    int main()
    {
    string s;
            var v;
    
            stringstream str;
            str << hex<< v;
            str >> s;
    
    cout<< hex << &f << endl; // Zur Kontrolle
    cout<<"Speicheradresse der Variable f in hex: " << s<<endl;
    
            return 0;
    }
    


  • Spitzbube schrieb:

    Das funktioniert:

    #include <iostream>
    #include <sstream>
    using namespace std;
    
    int f=1;
    
    class var
    {
    
    };
    
    ostream &operator<< (ostream &os, var &v )
    {
            return os<< &f ;
    }
    
    int main()
    {
    string s;
            var v;
    
            stringstream str;
            str << hex<< v;
            str >> s;
    
    cout<< hex << &f << endl; // Zur Kontrolle
    cout<<"Speicheradresse der Variable f in hex: " << s<<endl;
    
            return 0;
    }
    

    Was zum Teufel ist das für ein Scheiß?

    Das einfachste, schnellste Ergebnis wäre das hier:

    int a;
    std::string speicheradresse(boost::lexical_cast<std::string>(&a));
    


  • Hacker schrieb:

    Was zum Teufel ist das für ein Scheiß?

    Hab ich mir genau in diesem Moment auch gedacht. 😃


  • Mod



  • SeppJ schrieb:

    http://en.cppreference.com/w/cpp/string/basic_string/to_string

    Das unterstützt mein Compiler nicht. Außerdem ist lexical_cast schneller, wetten?



  • 1. Dann nimm nen besseren Compiler.
    2. Bezweifle ich, lexical_cast ist langsam wie eingeschlafene Füße, dank dem Designfetisch der Boost Devs.



  • Ethon schrieb:

    1. Dann nimm nen besseren Compiler.

    Ich hab den GCC. 🕶
    Es gibt mit Abstand nichts besseres.
    Aber wo gibt es den MinGW mit dem neuesten GCC 4.7 (32-Bit, wenn möglich) zum download? Ich hab 4.6.1 :gespannt:



  • Natürlich unterstützt der GCC 4.6 to_string . Sicher dass es nicht geht? <string> eingebunden?



  • #include <iostream>
    #include <string>
    
    int main()
    {
        std::string s = std::to_string(5);
        std::cout << s;
    }
    

    GCC 4.6.2 und auch 4.7 schrieb:

    Fehler: »to_string« ist kein Element von »std«

    Also das versteh' ich jetzt echt nicht.
    Auszug aus meiner include/c++/bits/basic_string.h:

    inline string
      to_string(int __val)
      { return __gnu_cxx::__to_xstring<string>(&std::vsnprintf, 4 * sizeof(int),
    					   "%d", __val); }
    

    Und sogar das hier gibt dieselbe Fehlermeldung, auch mit -std=c++0x usw.

    #include <bits/basic_string.h>
    

    Keine Ahnung was da los ist..



  • Da is nix los. Da sind einfach vordefinierte Makros am Werk... ich guck gleich mal welche das sind...



  • Ethon, das ist unfair! Wieso darfst du to_string benutzen und ich nicht? 😞



  • Ich fühl mich langsam verarscht, ich konnte eben auch nicht std::string::pop_back() auf meinem 4.7 nutzen. Hab mir eben hier http://nuwen.net/mingw.html das Neueste gedownloadet. pop_back() geht jetzt, aber to_string immer noch nicht 😞

    Naja, ich werd wohl noch länger warten müssen..



  • Das liegt daran, dass to_string beim MinGW nicht dabei ist, warum auch immer. :p



  • Naja, so einfach die Frage auch war, hab ich in den ganzen 19 Antworten keine Lösung gefunden))))

    Wie kann ich denn nun eine Speicheradresse in einen String bzw. konstante Zeichenkette schreiben?



  • RussianTux schrieb:

    Naja, so einfach die Frage auch war, hab ich in den ganzen 19 Antworten keine Lösung gefunden))))

    Wie kann ich denn nun eine Speicheradresse in einen String bzw. konstante Zeichenkette schreiben?

    Hä? Das wurde jetzt mitunter mehrmals vorgemacht!


Anmelden zum Antworten