Debugging und std::vector Problem (vermutlich)


Sliver

Still Fresh
Joined
Oct 2, 2006
Messages
13
Website
myemu.masen-inhabitants.com
WEBSITE
http://myemu.masen-inhabitants.com
Hi
nachdem mein erster Snake Clone fertig ist, wollte ich mich mal an nem größerem GP2X Programm versuchen :)
Das ganze soll mal ein Filemanager werden oder irgendwas in die Richtung; um es für den User übersichtlicher zu machen wird es Fenster geben. Das funktioniert teilweise auch schon - aber nur unter Windows, der GP2X scheint sich aufzuhängen...

Jetzt meine erste Frage: Wie kann man das anständig debuggen? Ich hab mich bisher immer Zeile für Zeile vorwärts getastet und den Cursor ausgeschaltet. Aber das ist ja auf Dauer nicht wirklich praktikabel.

Und die 2. Frage: Das Problem liegt so wies aussieht beim Rendern der Fenster. Der Code dafür:
Code:
<i>
</i>void CWindow::redraw(SDL_Surface *screen)
{
	// ...
	// Das Rendern selbst funktioniert noch...

	// Redraw all childs
	for(unsigned int i=0;i<m_pChilds.size();i++)
	{
		if(m_pChilds.at(i))
			m_pChilds.at(i)->redraw(screen);
	}
}
Wie man sieht hat jedes Fenster einen vector mit Pointern auf die Child Fenster. Was ich jetzt mache ist durch diesen vector zu gehen und alle Child Windows ebenfalls zu rendern und dabei gibts wohl ne Endlosschleife oder was änhliches.
Ein einfacher Bug kann das eigentlich nicht sein, weil es ja unter Win läuft...
 
Ich benutze zum Debuggen ganz gerne ne log datei, da kann man dann eine Situation kreiren, bei der man ein Bestimmtes verhalten erwartet, und dies dann anhand der logdatei nochvollziehen, ob auch der weg eingeschlagen wurde.
 
Hm, naja Logfiles sind im Prinzip nicht schlecht. Aber ich hab das jetzt ausprobiert und es funktioniert nicht wirklich. Das Problem ist vermutlich, dass der Logfile ja nicht geclosed wird. Ich kann den auch gar nicht closen, weil ich ja den GP2X einfach ausschalten muss. Das heißt Linux kann das was im Cache steht nicht auf die SD Card schreiben und deshalb gibts dann auf dem PC auch keine Datei...

Ich kann nochmal versuchen das wegschreiben vom Buffer Inhalt mit flush zu erzwingen, aber eigentlich ist ja ein flush bei nem endl mit drin. Und endls hab ich drin...
 
Sliver said:
Hm, naja Logfiles sind im Prinzip nicht schlecht. Aber ich hab das jetzt ausprobiert und es funktioniert nicht wirklich. Das Problem ist vermutlich, dass der Logfile ja nicht geclosed wird. Ich kann den auch gar nicht closen, weil ich ja den GP2X einfach ausschalten muss. Das heißt Linux kann das was im Cache steht nicht auf die SD Card schreiben und deshalb gibts dann auf dem PC auch keine Datei...

Ich kann nochmal versuchen das wegschreiben vom Buffer Inhalt mit flush zu erzwingen, aber eigentlich ist ja ein flush bei nem endl mit drin. Und endls hab ich drin...
Naja, mein Tip wäre:
Logfile auf,
Log rein,
Logfile zu,
Logfile auf,
Log rein,
Logfile zu,
Logfile auf,
Log rein,
Logfile zu,
Logfile auf,
Log rein,
Logfile zu,
Logfile auf,
Log rein,
Logfile zu...
 
Funktioniert auch so nicht... komisch :huh:

Dafür weiß ich jetzt wo genau das Problem mit dem Rendern liegt! Und zwar ist der Code natürlich je nachdem was gerendert werden soll verschieden. Und beim Code für Fenster - wo ich immer gesucht hab - war auch kein Fehler. Das Problem liegt bei dem Teil der für die Buttons zuständig ist. Und zwar seltsamerweise bei diesen beiden Zeilen:
Code:
<i>
</i>unsigned int posx = static_cast<unsigned int>(
px+m_iPosX+((((px+m_iPosX+m_iSizeX)-(px+m_iPosX))-m_pCaptionSurface->w)*0.5));

unsigned int posy = static_cast<unsigned int>(	py+m_iPosY+((((py+m_iPosY+m_iSizeY)-(py+m_iPosY))-m_pCaptionSurface->h)*0.5));

Da wird einfach nur die Position für die Button Beschriftung berechnet. Kann es sein, dass das '*0.5' das Problem verursacht, weil ja damit ein float/double erzeugt wird?
 
Hat keiner ne Idee?

Die erste Version ist jetzt nämlich fertig, aber läuft halt nicht auf dem GP2X...
Inzwischen funktioniert es nicht mal mehr wenn ich den Code von oben rausnehme, anscheinend gibts jetzt mehr solche Stellen.

Btw, ich verwende dieses 30MB große Paket aus dem Archiv für Windows, wo schon alles Libs dabei sind, und rufe den Compiler so auf:
arm-linux-g++ -c -O3 -Wall -o main.o -Id:\devkitgp2x\devkitgp2x\include main.cpp
Und den Linker so:
arm-linux-g++ -o fileman.gpe -O -lSDL -lSDL_ttf -lfreetype -lSDL_image -lpng *.o -Ld:\devkitgp2x\devkitgp2x\lib
 
Back
Top