SDL ttf Problem
-
Wie soll ich es den Ausgeben wenn ich nicht schreiben kann? Ich kann doch keine Schrift laden! --> Deshalb auch nicht Texte schreiben.
MfG
Stromberg
-
Du wirst doch wohl noch ein printf/std::cout<< auf die Konsole hinkriegen, oder? Oder zumindest in ein Logfile? Wenn nicht, würd ich mit dem Problem da mal pausieren und nochmal da anfangen, wo die Defizite sind...

-
Hallo
Wenn du es gar nicht schaffst, füllst du einfach einen string und schaust ihn dir im Debugger an.
chrische
-
chrische5 schrieb:
Hallo
Wenn du es gar nicht schaffst, füllst du einfach einen string und schaust ihn dir im Debugger an.
chrische
wenn er nichtmal auf die idee kommt, printf zu benutzen, wird er es auch nicht schaffen, den string in einem debugger zu betrachten

-
Ich kann dass nur so machen, und da wird nix in die Konsole Ausgegeben:
..... ...... font = TTF_OpenFont("lazy.ttf",24); if(font == NULL) { cout << TTF_GetError() << "\n"; return 1; } text = TTF_RenderText_Solid(font, "FUCK UP!", textColor); if(text == NULL) ...... .....Ich könnt es höchstens noch in eine .txt auslesen. Vll. klappt ja dass? Oder wie hab ihr euch dass vorgestellt?
MfG
Stromberg
-
Stromberg schrieb:
Ich könnt es höchstens noch in eine .txt auslesen. Vll. klappt ja dass? Oder wie hab ihr euch dass vorgestellt?
mad_martin schrieb:
Oder zumindest in ein Logfile?
Ja, scheint so

Achja, und verwende bitte std::endl anstatt "\n".
-
Hallo
Warum nimmst du nicht meine Lösung? Ohne Logfile und auch sonst sehr schnell gemacht.
chrische
-
@chrische5
Ich kann nich mitm Debugger umgehen
@mad_martin
Warum "std::endl"?@all
Wie kann ich eigentlich in SDL in die normale Konsole Texte, Werte....reinschreiben?
Gibt es da gar keinen Weg?MfG
Stromberg
-
Stromberg schrieb:
@chrische5
Ich kann nich mitm Debugger umgehen
Unbedingt lernen. Sonst kommst du nicht weit. Gutgemeinter Rat!
Stromberg schrieb:
@mad_martin
Warum "std::endl"?std::endl deshalb, weil die neue Zeile je nach dem, auf welchem Betriebssystem du bist, nicht unbedingt mit "\n" erreicht ist. std::endl steht halt für endline, da sollte man das auch benutzen. Ist einfach sauberer so.
Stromberg schrieb:
@all
Wie kann ich eigentlich in SDL in die normale Konsole Texte, Werte....reinschreiben?
Gibt es da gar keinen Weg?MfG
StrombergUnd wie meinst du das genau? Hast du eine Konsole neben dem SDL-Fenster oder nicht? Wenn ja, sollte std::cout<< reichen. Wenn nein, musst du das Ding als Konsolenanwendung kompilieren.
-
Stromberg schrieb:
Warum "std::endl"?
wenn du nur ein "\n" ausgibst, wird der text nicht unbedingt auf der konsole ausgegeben, es kann sein, dass noch gewartet wird, ob vielleicht noch mehr kommt, bevor man text ausgibt, um mehr in einem rutsch auszugeben.
std::endl bewirkt das gleiche wie "\n" UND zwingt das programm, den Text sofort auszugeben. std::flush kannst du auch benutzen, das zwingt das programm auch, alles auszugeben (gibt aber kein "\n" aus).
-
Zur Konsole:
Also es läuft bei mir nebenbei eine Konsole (wird halt geöffnet, wenn dass SDL Fenster startet).
Aber bei std::cout wird irgendwie nix in die Konsole ausgegeben.
An was könnte dass liegen?MfG
Stromberg
-
Die SDL leitet die Ausgabeströme stdout und stderr standardmäßig in die Dateien stdout.txt und stderr.txt um. Deshalb bekommst du mit std::cout nie eine Ausgabe in die Konsole. Suche stattdessen im Verzeichnis, in dem du deine Executable ausführst nach diesen Dateien, die sollten den ausgegebenen Text enthalten.
-
Heinzelotto schrieb:
Stromberg schrieb:
Warum "std::endl"?
wenn du nur ein "\n" ausgibst, wird der text nicht unbedingt auf der konsole ausgegeben, es kann sein, dass noch gewartet wird, ob vielleicht noch mehr kommt, bevor man text ausgibt, um mehr in einem rutsch auszugeben.
std::endl bewirkt das gleiche wie "\n" UND zwingt das programm, den Text sofort auszugeben. std::flush kannst du auch benutzen, das zwingt das programm auch, alles auszugeben (gibt aber kein "\n" aus).Das war der andere Aspekt, warum man std::endl benutzen sollte und den ich vergessen hatte.
-
Der Fehler heißt: Library not initialized
Sagt mir nicht viel jetzt, aber ich installier dann einfach die ttf Lib neu, vll. hab ich irgendwas falsch gemacht.
Was würdet ihr machen?MfG
Stromberg
-
Hallo
Ich würde zuerst den Umgang mit dem Debugger lernen bevor ich weiter machen würde.
chrische
-
Joa okay, wenn dass so wichtig ist sollte ich den Umgang mit einem Debugger wirklich lernen, kennt jemand eine gute Anleitung o.ä. dafür?
PS:
Ich hab nun auch den Fehler gefunden, ziemlich dummer Fehler:if(TTF_Init() == -1) { return 1; }MfG
Stromberg
-
Hallo
Vielleicht hilft dir das:
http://magazin.c-plusplus.net/artikel/Debuggen mit VCPlusPlus6
chrische
-
Irgendwie geht der Debugger nicht. N paar Menüpunkte kann ich nicht anklicken, sind so hell grau....und wenn ich einen Breakpoint setze, dann passiert überhaupt nix. Obwohl ich mich im Debugg Modus befinde, es passiert dass gleiche wie beim ganz normalen Compilieren.
Ich hab auch dass Häckchen bei "produce debugging symbols" gesetzt.
Hat von euch vll. jemand Codeblocks? Wie bekomme ich den Debugger zum laufen? Ich hab ka...ich weiß nicht mal genau ob er funktioniert....
Codeblocks Version ist 8.02 war so n rundum Packet mit Compiler + Debugger.Ich hoffe jemand von euch kann mir helfen, hab kein Plan wie ich da jetzt was mitm Debugger mache.
MfG
Stromberg
-
Also im Prinzip brauchst du den Debugger in sehr wenigen Fällen. Zumindest ich. Wollte mich nie in diesen dbg oder wie das Teil das beim gcc compiler dabei ist, einarbeiten. Und habe schon größere Projekte ohne Probleme geschrieben.
Dass SDL standardmäßig die Ausgabe in Dateien umleitest weisst du ja mitlerweile. Weiß jetzt nicht ob das auch unter Linux passiert.
Mit dem Code kannst du das wieder ausschalten. Dann wirds normal in die Konsole ausgegeben. Funktioniert aber nur unter Windows.
AllocConsole(); freopen("CON", "w", stdout); freopen("CON", "w", stderr); // freopen("CON", "r", stdin); // keine ahnung ob man das auch tun mussAber in einer (oder 2) Datei alles zu haben ist nicht schlecht, wenn du Fehler suchen willst. Und die exe mal nicht aus codeblocks startest.
Fürs debuggen waren mir diese Markros immer hilfreich:
#define LOGLINE do { std::cout << __LINE__ << ": " << __FILE__ << std::endl; }while(0) #define LOGVAL(x) do { std::cout << #x << " = '" << (x) << "'" << std::endl; }while(0)mit dem ersten wird die Zeile + Dateiname ausgegeben in dem sich LOGLINE befindet. Mit LOGVAL(x) kannst du schnell den Wert einer Variablen ausgeben.
Also damit ausgerüstet und nach Auschschlussverfahren konnte ich bisher fast alle meine Fehler finden.
Meistens müssen noch Bestimmte Anweisungsblöcke ausgeklammert werden. Mit diesem Trick funktioniert das sehr schnell:
So auskommentiert /* hier steht .. viel drin Beachte das // Am Anfang in der letzten Zeile // */Um den Block wieder zu aktivieren.
Schreibe bei der oberen /* ein / davor.also
//* Jetzt gehts rund... hier steht .. viel drin Beachte das // Am Anfang in der letzten Zeile // */Ansonsten verwende ich noch diesen Memory Manager: http://www.paulnettle.com/pub/FluidStudios/MemoryManagers/Fluid_Studios_Memory_Manager.zip
Und fast vergessen, schreibe viele Unittests...