Die RICHTIGE Art zu konvertieren



  • Swordfish schrieb:

    Ich würd' nen stringstream bemühen.

    Genau das habe ich auch. Ich weiß nur nicht ob diese Lösung elegant ist. Ich will nur das beste für mein Projekt.


  • Mod

    Bizarreofnature schrieb:

    Swordfish schrieb:

    Ich würd' nen stringstream bemühen.

    Genau das habe ich auch. Ich weiß nur nicht ob diese Lösung elegant ist. Ich will nur das beste für mein Projekt.

    Da gibt es keine allgemein beste Patentlösung. Es gibt schließlich Gründe, warum es so viele verschiedene Lösungen gibt. Die unterscheiden sich jeweils darin, wie mächtig sie sind, wie fehlerrobust sie sind, wie einfach sie zu benutzen sind, wie schnell sie sind. Und selbst in diesen Kategorien ist das jeweils eine komplexe Fragestellung. Beispielsweise ist bei "wie mächtig es ist" nicht so einfach zu sagen, dass diese oder jene Methode mehr kann als andere, sondern die können halt alle etwas anderes, bzw. eben nicht.



  • Weißt du denn, dass die Konvertierung immer möglich ist? Oder muss man mit nicht-konvertierbaren Zeichen rechnen?



  • Warum nicht einfach std::stoul? Oder halt was benötigt wird.
    Hier findest zu unter "Numberic conversions" einige Funktionen: http://en.cppreference.com/w/cpp/header/string
    Wenn unkonvertierbare chars darin enthalten sind, wird eine Exception geworfen.



  • Überhaupt: was meinst du mit "idealste"? Idealer als ideal? Wobei dann die Frage ist, was ideal ist.

    char* -> stringstream -> int ist jedenfalls eine Lösung für dich, wenn du gerne viel CPU-Zeit verschenkst :-), also absolut ungeeignet, wenn du viele Zahlen hast.

    Wenn du dagegen eine Datei einliest, würde ich schon aus dem ifstream lesen, aber ohne den Umweg über die char*-Variable.

    Ansonsten hat Alexandrecu auch die Konvertierung str->int in einem seiner Talks drin: https://www.youtube.com/watch?v=o4-CwDo2zpg - schau dir das mal an.



  • Bizarreofnature schrieb:

    idealste

    double-facepalm

    1. ideal ist bereits superlativ
    2. ideal beurteilt nach welchen kriterien? eleganz? kurz zu schreiben? performant? ...?

    wenns um kurz/einfach zu schreiben und lesen geht würde ich bei int->string z.b. mal sagen: std::to_string .



  • Weißt du denn, dass die Konvertierung immer möglich ist? Oder muss man mit nicht-konvertierbaren Zeichen rechnen?

    Ja, ist immer möglich. Nur Zahlen.

    Überhaupt: was meinst du mit "idealste"? Idealer als ideal? Wobei dann die Frage ist, was ideal ist.
    
    char* -> stringstream -> int ist jedenfalls eine Lösung für dich, wenn du gerne viel CPU-Zeit verschenkst :-), also absolut ungeeignet, wenn du viele Zahlen hast.
    
    2) ideal beurteilt nach welchen kriterien? eleganz? kurz zu schreiben? performant? ...?
    

    Tatsächlich bräuchte ich eine performante Lösung. Ich programmiere ein Spiel.
    Ich schätze, das wäre für mich dann die "idealste" Lösung.

    Zu den Links: Schau mir gleich an.



  • Wie kommen die Zahlen in Strings??



  • Swordfish schrieb:

    Wie kommen die Zahlen in Strings??

    Grob abgekürzt habe ich eine int Highscore mit der ich rechne und diese will ich auch als const char* anzeigen lassen.

    Wie auch immer, ich brauche eine int to char* und char* to int Konvertierung.


  • Mod

    Hier stimmt doch irgendetwas nicht. Erst soll es möglichst performant sein, dann geht es um reine Anzeige. Hast du nun Strings oder wirklich const char* und wenn const char*, warum keine Strings? Du hast auch immer noch nicht gesagt, wieso da überhaupt Zahlen in Strings sind.

    Wie soll man dir denn eine ideale Lösung vorschlagen, wenn deine Beschreibung unvollständig und widersprüchlich ist? Eine ideale Lösung heißt doch schließlich, dass sie ideal auf den Sachverhalt zugeschnitten ist. Der hier völlig mysteriös ist.

    Am besten lässt du mal vollständig alle deine Vorurteile fallen, was du denkst, was eine ideale Lösung ausmacht. Stattdessen beschreib mal möglichst genau, was warum in welcher Form vorliegt und in was du dies warum in welche andere Form konvertieren möchtest. Pass auf: Das sind pro Konvertierung sechs Fragen, die du beantworten solltest!



  • Uff...

    Ganz ehrlich, im Grunde habe ich bis jetzt nur die Highscore als Grund zum Konvertieren.

    Die Highscore ist ein int und soll als const char* angezeigt werden.
    (Ich programmiere mit der SFML.) Klar kann man auch Strings nehmen, aber ich würde diesmal gerne mit char arbeiten, da ich mich sonst immer drum gedrückt habe.

    Die Highscore soll im Menu angezeigt werden und im Spiel selbst. Wegen 2. brauche ich eine performante Lösung.



  • Bizarreofnature schrieb:

    Klar kann man auch Strings nehmen, aber ich würde diesmal gerne mit char arbeiten, da ich mich sonst immer drum gedrückt habe.

    std::string ist char* in jeder Hinsicht überlegen. Wenn du trotzdem mit char* arbeiten willst, solltest du dafür extrem gute Gründe haben.

    Die Highscore soll im Menu angezeigt werden und im Spiel selbst. Wegen 2. brauche ich eine performante Lösung.

    Dann empfehle ich für den ersten Ansatz std::to_string für die eine Richtung und std::stoi für die andere.

    Weitere Optimierungsversuche solltest du erst dann unternehmen, wenn genau diese Stelle sich nachweislich als Flaschenhals herausstellt.



  • Klingt nach einem Plan. Vielen Dank 🙂



  • Bizarreofnature schrieb:

    [...] Highscore [...]

    Magst Du das Projekt irgendwo hochladen? RTCW wird schön langsam fad zum Spielen.



  • Swordfish schrieb:

    Bizarreofnature schrieb:

    [...] Highscore [...]

    Magst Du das Projekt irgendwo hochladen? RTCW wird schön langsam fad zum Spielen.

    Habe bis jetzt nur die fundamentalen Klassen geschrieben die das Game braucht.. z.B. Audio, Sprite etc.

    Bin jetzt gerade am Mainmenu.



  • So und schon kommt das erste Problem 😞

    const char* CConvert::IntToChar (int p_nInt)
    {
    	std::string String = std::to_string (p_nInt);
    
    	return String.c_str ();
    }
    

    Gibt einfach garnichts zurück. Zumindest wird im Game nichts angezeigt.
    (Ich habe eine Funktion const char* zu rendern.)



  • Du gibst einen Pointer auf einen internen Buffer von std::string zurück. Da String Funktionslokal ist existiert dieser std::string samt seiner Innereien nicht mehr nachdem die Funktion zurückgekehrt ist. Verwendest Du den zurückgegebenen Pointer danach, greifst Du auf Speicher zu, der dir nicht gehört.

    Nebenbei: Hast Du zufällig ein Buch von Jürgen Wolf?

    PS: Was soll dieses int p_n... ?

    PPS:

    Bizarreofnature schrieb:

    (Ich habe eine Funktion const char* zu rendern.)

    Du machst dieses RenderHighscorePseudo(CConvert::IntToChar(highscore)) aber nicht bei jedem Durchlauf der Gameloop, gell??

    Ist das Projekt noch 1ne Datei? Dann poste bitte mal ...



  • Swordfish schrieb:

    Du gibst einen Pointer auf einen internen Buffer von std::string zurück. Da String Funktionslokal ist existiert dieser std::string samt seiner Innereien nicht mehr nachdem die Funktion zurückgekehrt ist. Verwendest Du den zurückgegebenen Pointer danach, greifst Du auf Speicher zu, der dir nicht gehört.

    Nebenbei: Hast Du zufällig ein Buch von Jürgen Wolf?

    PS: Was soll dieses int p_n... ?

    Sauber! Klappt 🙂 danke dir! Jetzt mach ich mich an chartoint ran.

    Nein, dieses Buch habe ich nicht. Ich hab ein Buch das ist aber schon älter als 12 Jahre. "C++ für Spieleprogrammierer".

    EDIT: Saubere ungarische Notation 🙂



  • Bizarreofnature schrieb:

    Sauber! Klappt 🙂

    Wie klappt es jetzt?

    Siehe edits oben.



  • Wie klappt es jetzt?

    Hab den Buffer als private Membervariable.

    Du machst dieses RenderHighscorePseudo(CConvert::IntToChar(highscore)) aber nicht bei jedem Durchlauf der Gameloop, gell??

    Ne 🙂

    Ist das Projekt noch 1ne Datei? Dann poste bitte mal ...

    Das Projekt hat etwa 20 Dateien bis jetzt. Ich kann es aber gerne hochladen wenn es fertig ist.


Anmelden zum Antworten