Speicheradresse zu String



  • Die Frage ist einfach, wie könnte man eine Hexadezimale Speicheradresse als String- / Char-Array abspeichern bzw. in einen String schreiben?



  • std::string s = (std::istringstream() << std::hex << reinterpret_cast<std::intptr_t>(ptr)).str();
    

    Ungetestet.



  • 314159265358979 schrieb:

    std::string s = (std::istringstream() << std::hex << reinterpret_cast<std::intptr_t>(ptr)).str();
    

    Ungetestet.

    Muss doch ein ostringstream sein?


  • Mod

    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.



  • 314159265358979 schrieb:

    std::string s = (std::istringstream() << std::hex << reinterpret_cast<std::intptr_t>(ptr)).str();
    

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


  • 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? 😞


Anmelden zum Antworten