Debugging und std::vector Problem (vermutlich)

Programmieren in C++
Antworten
Autor
Nachricht
Sliver
3 Bit
Beiträge: 13
Registriert: Mo Okt 02, 2006 14:27
Kontaktdaten:

Debugging und std::vector Problem (vermutlich)

#1 Beitrag von Sliver » Mo Okt 02, 2006 14:44

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: Alles auswählen

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...

Benutzeravatar
Krux
9 Bit
Beiträge: 555
Registriert: Di Feb 28, 2006 20:03
Wohnort: Emsdetten

#2 Beitrag von Krux » Mo Okt 02, 2006 16:35

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.

Sliver
3 Bit
Beiträge: 13
Registriert: Mo Okt 02, 2006 14:27
Kontaktdaten:

#3 Beitrag von Sliver » Mo Okt 02, 2006 21:43

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...

Benutzeravatar
Ziz
10 Bit
Beiträge: 1990
Registriert: So Jan 15, 2006 14:09
Wohnort: Dresden
Kontaktdaten:

#4 Beitrag von Ziz » Mo Okt 02, 2006 23:14

Sliver hat geschrieben: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...
Bild

Sliver
3 Bit
Beiträge: 13
Registriert: Mo Okt 02, 2006 14:27
Kontaktdaten:

#5 Beitrag von Sliver » Di Okt 03, 2006 10:19

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: Alles auswählen

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?

Sliver
3 Bit
Beiträge: 13
Registriert: Mo Okt 02, 2006 14:27
Kontaktdaten:

#6 Beitrag von Sliver » So Okt 08, 2006 12:17

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

Antworten

Zurück zu „C++“

Wer ist online?

Mitglieder in diesem Forum: 0 Mitglieder und 1 Gast