Die RICHTIGE Art zu konvertieren
-
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. DaString
Funktionslokal ist existiert dieserstd::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. DaString
Funktionslokal ist existiert dieserstd::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.
-
Zeig bitte mal die Klasse
CConvert
...
-
Swordfish schrieb:
Zeig bitte mal die Klasse
CConvert
...Bin gerade am ändern. Gib mir ein paar Minuten. Btw. die Klasse ist nicht gerade spektakulär...
-
Die cpp ist noch unkommentiert.
#ifndef CConvert_HPP #define CConvert_HPP // standard headers #include <string> // sfml headers // classes // forward declarations // CConvert class: manages all conversions class CConvert { private: // string buffer std::string m_stStringBuffer; // int buffer int m_nIntBuffer; public: // convert int to const char* const char* IntToChar (int p_nInt); // convert const char* to int int CharToInt (const char *p_pchChar); }; #endif
// include needed headers #include "CConvert.hpp" const char* CConvert::IntToChar (int p_nInt) { m_stStringBuffer = std::to_string (p_nInt); return m_stStringBuffer.c_str (); } int CConvert::CharToInt (const char *p_pchChar) { m_nIntBuffer = std::stoi (p_pchChar); return m_nIntBuffer; }
-
Bizarreofnature schrieb:
EDIT: Saubere ungarische Notation
pch --> sz
p_ für Funktionsparameter kennt die originale HN eigentlich nicht.Zum Rest sag ich jetzt nur, was Dir schon mehrfach gesagt wurde. Benutze
std::string
. Warum stecken die beiden Funktionen überhaupt in einer Klasse? Zustand sollten beide keinen haben und zum thematisch Zusamenfassen tuts ein Namespace.
-
Swordfish schrieb:
Bizarreofnature schrieb:
EDIT: Saubere ungarische Notation
pch --> sz
p_ für Funktionsparameter kennt die originale HN eigentlich nicht.Zum Rest sag ich jetzt nur, was Dir schon mehrfach gesagt wurde. Benutze
std::string
. Warum stecken die beiden Funktionen überhaupt in einer Klasse? Zustand sollten beide keinen haben und zum thematisch Zusamenfassen tuts ein Namespace.Die Klasse wird eventuell noch größer und da bin ich froh wenn es abgekapselt ist.
Soll ich jedes pch mit einem sz ersetzen?
-
Btw das mit den Namespace finde ich interessant. Gibts dazu gute Tutorials?
-
#include <string> namespace Conversions { std::string ToString(int number) { return std::to_string(number); } int ToInt(std::string const &str) { return std::stoi(str); } } int main() { char const * sz{ "1234" }; int n = Conversions::ToInt(sz); std::string str = Conversions::ToString(n); }
-
Genial! Vielen Dank
-
Es klappt. Total genial. Vielen Dank nochmal
wieder was gutes dazu gelernt.
Eine Frage noch. Wo genau binde ich die namespace Datei ein? in der "main.cpp" ?
-
Bizarreofnature schrieb:
Wo genau binde ich die namespace Datei ein? in der "main.cpp" ?
Dort, wo Du die darin deklarierten Funktionen brauchst??
Convert.hpp
#ifndef Convert_HPP #define Convert_HPP #include <string> namespace Convert { std::string ToString(int number); int ToInt(std::string const &str); } #endif /* Convert_HPP */
Convert.cpp
#include "Convert.hpp" namespace Convert { std::string ToString(int number) { return std::to_string(number); } int ToInt(std::string const &str) { return std::stoi(str); } }
-
Alles klar, vielen Dank
-
So etwas wie "private" oder "public" gibts bei namespace nicht, oder?
-
Nein.
^Ich frag jetzt mal bewusst nicht warum man das haben wollen würde.^
-
Swordfish schrieb:
Nein.
^Ich frag jetzt mal bewusst nicht warum man das haben wollen würde.^
#include <string> namespace Convert { std::string m_stStringBuffer; const char* IntToChar (int p_nInt) { m_stStringBuffer = std::to_string (p_nInt); return m_stStringBuffer.c_str (); } }
Komme leider nicht drum rum.
-
Swordfish schrieb:
Zustand (dein
m_stStringBuffer
*)) sollten beide [Funktionen] keinen haben [...]Printe schrieb:
std::string ist char* in jeder Hinsicht überlegen. Wenn du trotzdem mit char* arbeiten willst, solltest du dafür extrem gute Gründe haben.
SeppJ schrieb:
warum keine Strings?
jetzt wird es mit
m_...
noch enger, denn Namespaces sind keine Klassen oder Structs, von denen es Instanzen geben könnte. Deinm_stStringBuffer
ist eher eing(lobal)_sonstwas
.