Vorheriges Thema anzeigen :: Nächstes Thema anzeigen |
Autor |
Nachricht |
Beni5 Super JLI'ler
Alter: 36 Anmeldedatum: 12.11.2003 Beiträge: 310 Wohnort: Switzerland Medaillen: Keine
|
Verfasst am: 14.06.2004, 09:35 Titel: Problem mit Liste |
|
|
Hallo!
Um ein paar Items zu zeichnen wollte ich eine Liste verwenden. Nun stürzt das Programm leider immer ab und ich habe keine Ahnung wieso. Es stürzt ab wenn ich ein neues Item anlegen (Ich kann genau eines anlegen bei 2 stürzt es ab) will oder wenn ich in der while schleife bei DrawItems NULL != p abfrage. Kann mir einer helfen? Hier sind noch alle Funktionen. Die Variabeln sind in der Klasse definiert.
THX
Code: |
void CGameManager::NewItem(int Number, D3DXVECTOR2 Pos)
{
// Neues Item deklarieren
Item* Element = new Item;
// Initialisieren
Element->Number = Number;
Element->Pos = Pos;
// Jetzt ist es das letzte
LastItem()->Next = Element;
}
void CGameManager::DrawItems(void)
{
Item* p = &Listenkopf;
while(NULL != p)
{
// Alle zeichnen
m_Sprite->Draw(40,40,0,4,p->Pos.x,p->Pos.y);
// Auf das nächste Element setzen
p = p->Next;
}
}
Item* CGameManager::LastItem(void)
{
Item* p = &Listenkopf;
// Wenn das nächste nicht das letzte ist
while(NULL != p->Next)
{
// Weiter
p=p->Next;
}
// Letztes zurückgeben
return p;
}
void CGameManager::DeleteItems(void)
{
while(NULL != Listenkopf.Next)
{
Item* p = &Listenkopf;
while(LastItem() != p->Next)
{
p = p->Next;
}
delete LastItem();
p->Next = NULL;
}
} |
|
|
Nach oben |
|
|
Jonathan_Klein Living Legend
Alter: 37 Anmeldedatum: 17.02.2003 Beiträge: 3433 Wohnort: Siegerland Medaillen: Keine
|
Verfasst am: 14.06.2004, 11:19 Titel: |
|
|
1. Du könntest einfach STL Listen verwenden, die sind einfacher zu handhaben
2. Was ist den &Listenkopf? Mpste doch so was in der art
struct Element
{
int Inhalt
Element *pNächstes;
}
sein, oder?
wenn du ei nneues Element erstellst, muzss du dessen Next Zeiger natürlich auf NULL setzten, und das sehe ich in der Funktion Newitem nicht.
Du könntest auch mal versuchen mithilfe des Debuggwers das Problem zu finden. Müsste ja was mit Speicherzugriffsverletzung zu tun haben _________________ https://jonathank.de/games/ |
|
Nach oben |
|
|
Beni5 Super JLI'ler
Alter: 36 Anmeldedatum: 12.11.2003 Beiträge: 310 Wohnort: Switzerland Medaillen: Keine
|
Verfasst am: 14.06.2004, 14:42 Titel: |
|
|
so eine Structr liegt auch vor. Ich habe dasselbe verwendet wie im Buch einfach andere Namen. Ich habe dank dem Debugger herausgefunden das die Fehler imemr bei der while überprüfung liegt, bei LastItem und Drawitems.
Zuletzt bearbeitet von Beni5 am 14.06.2004, 14:55, insgesamt einmal bearbeitet |
|
Nach oben |
|
|
fowly JLI'ler
Anmeldedatum: 25.01.2004 Beiträge: 196 Wohnort: Detmold - NRW Medaillen: Keine
|
Verfasst am: 14.06.2004, 14:45 Titel: |
|
|
trozdem beni, du solltest stl listen nehmen, die sind nicht nur einfacher, sondern in den meisten fällen auch schneller. _________________ <-- Noch in der Entwicklungsphase: http://www.uranus-entertainment.de -->
Das Spiel zu unserer Schule:
http://www.grabbe-game.de |
|
Nach oben |
|
|
Jonathan_Klein Living Legend
Alter: 37 Anmeldedatum: 17.02.2003 Beiträge: 3433 Wohnort: Siegerland Medaillen: Keine
|
Verfasst am: 14.06.2004, 14:51 Titel: |
|
|
Ich denke mal der Fehler ist das du den NextZeiger nicht auf NULL setzt. Da der nicht von Anfang an NULL ist funktioniert die Schleife in der Last() Funktion natürlich auch nicht. _________________ https://jonathank.de/games/ |
|
Nach oben |
|
|
Beni5 Super JLI'ler
Alter: 36 Anmeldedatum: 12.11.2003 Beiträge: 310 Wohnort: Switzerland Medaillen: Keine
|
Verfasst am: 14.06.2004, 15:00 Titel: |
|
|
Und wie soll ich den auf NULL setzen? Es stimmt schon der Debugger sagt auch es liegt an Next. Und wenn ich ihn auf NULL setze wird er in der while Schleife ja immer als NULL erkannt und das Programm verliert seinen Sinn. Und ich weiss nicht ob du mit dem NextZeiger was falsches verstehst. Next ist ein Member von Item. Und von Templates halte ich mich fern. |
|
Nach oben |
|
|
Jonathan_Klein Living Legend
Alter: 37 Anmeldedatum: 17.02.2003 Beiträge: 3433 Wohnort: Siegerland Medaillen: Keine
|
Verfasst am: 14.06.2004, 15:21 Titel: |
|
|
Also die Struktur heißt
Item
{
int Number
int Pos
Item* pNext;
}
pNext zeigt immer auf das nächste Element aus der Liste. Wenn es das letzte Element ist, zeigt pNext auf NULL um zu verdeutlichen, das kein weiteres Item existiert.
Also, muss du, wenn du ein neues Elemtn erstellst den pNext Zeiger auch auf NULL setzen, da es dann doch das letzte Elemnt ist, nach dem keins mehr kommt:
Code: |
void CGameManager::NewItem(int Number, D3DXVECTOR2 Pos)
{
// Neues Item deklarieren
Item* Element = new Item;
// Initialisieren
Element->Number = Number;
Element->Pos = Pos;
Element->pNext=NULL; //ganz ganz dolle wichtig!
// Jetzt ist es das letzte
LastItem()->Next = Element;
}
|
Probier das einfach ma aus. _________________ https://jonathank.de/games/ |
|
Nach oben |
|
|
Beni5 Super JLI'ler
Alter: 36 Anmeldedatum: 12.11.2003 Beiträge: 310 Wohnort: Switzerland Medaillen: Keine
|
Verfasst am: 14.06.2004, 15:24 Titel: |
|
|
O M G
Ich bin wirklich Blind!!! Ich hab's voll übersehen... Danke Funktioniert Primaletti |
|
Nach oben |
|
|
|