Konvertierung long -> char*
-
Razhal schrieb:
Hallo,
danke erstmal für die Antwort. Nach der Erklärung habe ich den Fehler im Grunde verstanden, nur an der Umsetzung hapert es dennoch

Ist denn die Änderung inconst char* longvar = reinterpret_cast<const char*>(&m_deltaT);immernoch das selbe Problem? Der Zeiger geht jetzt doch direkt auf die Variablenadresse.
Funktionieren tut es nämlich immernoch nicht.
Was funktioniert denn nicht? Dieser Code ist so an sich korrekt. Du versuchst doch hoffentlich nicht, diesen Speicher dann mit 'delete' freizugeben? Das ist ja Stack-Speicher und kein Heap-Speicher.
-
Ich habe kein delete[] nachgefügt, da ich ja auch kein Objekt mit new angelegt habe.
Ich bekomme immernoch den Speicherzugriffsfehler. So langsam vermute ich aber, dass es an der SDL_ttf liegt - wahrscheinlich mal wieder die Schrift zu groß oder ähnliches.Danke trotzdem.
-
Also irgendwie stehe ich grad auf dem Schlauch, als Ausgabe bekomme ich die entspr. Werte der ASCII Tabelle an den Stellen von m_deltaT.
z.B.:
m_deltaT = 36 : Ausgabe $
m_deltaT = 38 : Ausgabe &
usw.Dann ist das auch kein Wunder, dass nach kurzer Zeit ein Speicherfehler auftritt, nämlich dann, wenn die Größe der ASCII Tabelle überschritten ist.
Ich möchte doch nur den Wert von m_deltaT augegeben haben.
-
Razhal schrieb:
Ich möchte doch nur den Wert von m_deltaT augegeben haben.
Ah, dann hast Du den Sinn von 'reinterpret_cast' falsch verstanden. Das, was Du willst, ist eine Zahl als String ausgeben? Dann kannst Du einfach folgendes schreiben:
cout << m_deltaT;Wenn Du den Inhalt der Zahl in einen String speichern musst, dann schau Dir mal die FAQ „Einmal Zahl nach String und zurück“ an.
-
Ich habs nun doch noch hinbekommen.
Für alle die es interessiert:(statt long, nun int)
char buffer[256]; sprintf(buffer, "%i", m_deltaT/180);
-
Urg, 'sprintf', benutz lieber die andere Methode aus der FAQ, die ist weniger C-ig.

-
Wenn ich die Methode 1 oder 2 aus der FAQ nutze, bekomme ich als Resultat immer einen string, der Compiler meckert aber, weil ich ja als char* schreiben will.
Mit der sprintf und dem char buffer funktionierts doch.
Was ist an der Variante zu C-ig ?
Grüße.
-
Razhal schrieb:
Was ist an der Variante zu C-ig ?

Dass Du 'char*' statt 'std::string' benutzt, und außerdem, dass hier ein Puffer fester Größe verwendet wird. 256 ist zwar eine sichere Größe, aber vom Konzept her ist solch ein Code eine Einladung für Buffer Overflows. Solch ein Code ist einfach konzeptionell unsicher und sollte gemieden werden. Dafür gibt's ja extra die 'std::string'-Klasse.
-
Um einen std::string an eine Funktion zu übergeben, die einen "const char *" erwartet, gibt es die Methode c_str():
std::string s("Dein Text"); func(s.c_str());
-
wie bereits geschrieben nimmst du entweder std::string (#include <string>, zum Einlesen streams, die Umwandlung in const char* erfolgt durch stringvarialbe.c_str ())
oder du schreibst dir ne fkt, die das char* - teil für dich füllt...unsigned char GetLaenge (const unsigned long &nr) //& kannst du auch weglassen, wir der compiler eh nicht nutzen - schaden tut es aber nicht { //entweder du gehst über powerof oder machst es so in etwa: unsigned char laenge (0); for (long i (1); i <= nr;i*=10) { ++laenge; } return (laenge-1); }; void LongToChar (long nr, char *string) { unsigned char laenge (GetLaenge (nr)); delete string; string = new char [laenge+1]; string[laenge--] = 0; for (laenge; laenge != 0; --laenge) { string[laenge] = nr%10 + '0'; nr /= 10; } string[0] = nr + '0'; };Sollte so eigtl stimmen ^^
Byebye : )jz sollte es wirklich funktionieren ^^
-
unskilled, du machst deinem Namen alle Ehre -(
Dein Code ist grauenvoll...
- free() sollte man in C++ vermeiden (und erst recht nicht in Kombination mit new einsetzen)
- & ist völlig unnutz bei GetLaenge (und wenn schon dann eine konstante Referenz)
- viel zu C lastigFazit: ignorieren -)
-
1. hmmm... kA, warum ich da free hingeschrieben hatte

2. huch - das const hatte ich im eifer vergessen ^^
habs berichtigt3. na und?
wenn er char will, dann is das nu ma der effektivste weg ("Da der obrige Code 100/sec. aufgerufen wird")//edit: der funktionsname fehlt auch noch seh ich gerade - aber nun ja ^^
@~skilled denk dir halt drecks_c_style_fkt dort hin
und war noch nen fehler im schleifenkopf -.-
-
Also ich würde es mit std::stringstream machen:
long myLong; std::stringstream myString; myString << myLong; myFunction(myString.str().c_str());