Überlauf Problem
-
Okay ich hab jetzt alles so gemacht, leider klappt's immer noch nicht. Um das Problem mal genauer zu beschrieben:
Die Klasse Menu hat mehrere vectoren, einige enthalten GLfloat Objekte und einer ZentrierteSchrift Objekte. Beim hinzufügen neuer Elemente zum Vector mit den ZentrierteSchrift Objekten ändern sich plötzlich die im vector<GLfloat> Werte zu ziemlich komischen Zahlen wie: 67200099052103200000.000000 oder so ähnlich. Auf jeden Fall sehr groß. Manchmal passiert es auch dass sich das Programm mit einem Laufzeitfehler verabschiedet. Für mich spricht das alles nach einem undefinierten Verhalten weil ich irgentwo einen Fehler gemacht habe. Und ich glaube dass er in dieser Klasse liegt. Es ist zum verzweifeln.
mfg.
-
Machs doch einfach so:
Text[ strncpy(Text, was, strlen(was)) ] = '\0';
-
Any schrieb:
Machs doch einfach so:
Text[ strncpy(Text, was, strlen(was)) ] = '\0';Der Rückgabe wert von strncpy ist glaub ich ein Zeiger auf den String und nicht die übertragenen Bytes.
mfg.
-
Ich hatte jetzt kein Bock mehr auf den Kack, und hab jetzt alles durch std::strings ersetzt:
class ZentrierteSchrift { private: std::string Text; /* Text */ GLfloat x; /* Hälfte der Breite des Textes (negativ) */ GLfloat y; /* Viertel der "Hoehe des Textes" */ public: ZentrierteSchrift() {} /* Zeiger mit 0 initialisieren */ ZentrierteSchrift(const char *was) { Aktualisiere(was); } ~ZentrierteSchrift() { } /* Speicher freigeben */ void Aktualisiere(const char *was) /* Welcher Text soll eigentlich gezeichnet werden? */ { Text = was; SIZE Groesse; /* Lege SIZE Struktur für WinAPI Funktion an */ GetTextExtentPoint32(hDC,Text.c_str(),Text.size(),&Groesse); /* Groesse ermitteln */ x = static_cast<GLfloat>(Groesse.cx) / -2; /* Hälfte und negativ */ y = static_cast<GLfloat>(Groesse.cy) / 4; /* Viertel, da Windows auch noch Zeilenabstand mit einberechnet */ } void Ausgabe() { Schrift2.AusgabeEx(Text.c_str(),x,y); /* Schrift zentriert ausgeben */ } };Das klappt auch. Falls trotzdem jemand den Fehler sieht, würde ich mich darüber freuen, denn ich seh ihn immer noch nicht.
mfg.
-
joomoo schrieb:
Ich hatte jetzt kein Bock mehr auf den Kack, und hab jetzt alles durch std::strings ersetzt:
Warum nicht gleich so

-
joomoo dein Code ist ja voll gefrickelt.
-
joomoo schrieb:
Any schrieb:
Machs doch einfach so:
Text[ strncpy(Text, was, strlen(was)) ] = '\0';Der Rückgabe wert von strncpy ist glaub ich ein Zeiger auf den String und nicht die übertragenen Bytes.
mfg.
Hast recht, man müsste es so machen: strncpy(Text, was, strlen(was)+1) dann wird die 0 mitkopiert
-
Halbherziger Profi schrieb:
joomoo dein Code ist ja voll gefrickelt.
Das heißt?
mfg.
-
Any schrieb:
joomoo schrieb:
Ich hatte jetzt kein Bock mehr auf den Kack, und hab jetzt alles durch std::strings ersetzt:
Warum nicht gleich so

Jetzt muss jeden Frame std::string::c_str() aufgerufen werden. Ist das resourcenfressend?
mfg.
-
Nö, eigentlich nicht. Üblicherweise liegen die Strings im Speicher so vor und es wird nur der Zeiger rausgegeben. Klar, das garantiert einem niemand, dass das wirklich immer so ist, aber es ist sehr wahrscheinlich.
Allerdings: Ist std::string referenzgezählt und ist der String 'gesharet', so muss vor dem Aufruf von c_str eine Kopie angefertigt werden.
-
Hi,
du brauchst für die klasse einen copy-construktor, der nicht nur den Zeiger Text, sondern auch dessen Inhalt mitkopiert. Ansonsten hast du, im vector, lauter "ZentrierteSchrift"en, deren Text-Pointer alle auf den selben speicher-inhalt zeigen.