JLI Spieleprogrammierung Foren-Übersicht JLI Spieleprogrammierung

 
 FAQFAQ   SuchenSuchen   MitgliederlisteMitgliederliste   BenutzergruppenBenutzergruppen 
 medals.phpMedaillen   RegistrierenRegistrieren   ProfilProfil   Einloggen, um private Nachrichten zu lesenEinloggen, um private Nachrichten zu lesen   LoginLogin 

Fehler mit Liste
Gehe zu Seite 1, 2, 3, 4, 5, 6  Weiter
 
Neues Thema eröffnen   Neue Antwort erstellen    JLI Spieleprogrammierung Foren-Übersicht -> Entwicklung
Vorheriges Thema anzeigen :: Nächstes Thema anzeigen  
Autor Nachricht
X-FILE
Super JLI'ler



Anmeldedatum: 12.07.2003
Beiträge: 349

Medaillen: Keine

BeitragVerfasst am: 14.09.2003, 16:28    Titel: Fehler mit Liste Antworten mit Zitat

Hallo,

ich muss hier wieder posten, weil ein Fehler aufgetreten ist, den ich nicht verstehe.

Ich habe folgenden Code:

Code:


if(TestPass == TRUE)
{
delete *Tstlst;
Tstslst = m_TestListe.erase(Tstlst);
}



Natuerlich habe ich oben iterator usw... initialisiert usw, usw.... Alles kein Thema. Das Ding stuerzt mit einer Speicherfehlermeldung ab und der Debugger sagt, es gaebe ein Problem mit dem naechsten Objekt. Da ist keines, das ist wahr, aber selbst wenn eins da ist, gibts Probleme?!
Die Schleife wird jedes Bildframe aufgerufen. Das Dumme ist, es hat mal funktioniert. Jetzt gehts nur noch, wenn ich den kompletten Delete-Kram weglasse.
Vielleicht hat jmd. ne Idee... vielen Dank.
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden
LeeDiGer
Super JLI'ler



Anmeldedatum: 31.08.2003
Beiträge: 366
Wohnort: Duisburg
Medaillen: Keine

BeitragVerfasst am: 14.09.2003, 16:38    Titel: Antworten mit Zitat

Probiers mal mit:

"delete (*Tstlst); " anstatt mit "delete *Tstlst; "

Bei mir habe ich immer eine Klammer um den Iterator gehabt. Und es hat immer funktioniert.
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden
X-FILE
Super JLI'ler



Anmeldedatum: 12.07.2003
Beiträge: 349

Medaillen: Keine

BeitragVerfasst am: 14.09.2003, 16:48    Titel: Antworten mit Zitat

Danke dir, aber daran lags nicht leider.

Es hat irgendwas mit dem naechsten Objekt zu tun.
Code:

aus der list-Definition:

iterator erase(iterator _P)
{_Nodeptr _S = (_P++)._Mynode();
_Acc::_Next(_Acc::_Prev(_S)) = _Acc::_Next(_S); <-Fehler!



ICh weiß nur ned, was er mir damit sagen will.
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden
X-FILE
Super JLI'ler



Anmeldedatum: 12.07.2003
Beiträge: 349

Medaillen: Keine

BeitragVerfasst am: 14.09.2003, 17:06    Titel: Antworten mit Zitat

Ok ich weiß wo das Problem liegt, aber leider immer noch nciht, wie ich es loesen kann.

Die Sache ist die. Ich habe in zwei Klassen zwei Listen mit Objekten, dioe jeweils das gleiche enthalten. Einmal zum Rendern und einmal zum Kollisionstesten und anderem.

Beide Male gehe ich die Listen durch un bearbeite sie. Loesche ich jetzt aus einer Liste etwas, dann gibts Fehler, ist ja klar.

Jetzt ist meine Frage, wie kann ich denn das alles auf eine Liste begrenzen? Ich kann ja eine Liste aus einer anderen Klasse nicht aufrufen, oder?
Also z.B. so:

Code:


TestKlasse1*  TstKlasse;

std::list<TestKlasse1*>::iterator Tst;

for(Tst = TstKlasse->m_TestListe.begin(); ....)



Gibts ne andere Moeglichkeit? Zum Beispiel aus beiden Listen gleichzeitig entfernen? Wohl nicht, oder??
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden
LeeDiGer
Super JLI'ler



Anmeldedatum: 31.08.2003
Beiträge: 366
Wohnort: Duisburg
Medaillen: Keine

BeitragVerfasst am: 14.09.2003, 17:26    Titel: Antworten mit Zitat

Mit dem ersten Code, der den Fehler verursachen soll, kann ich nichts anfangen. Zum 2. frag ich mich erst mal, wie du das mit dem gleichzeitig löschen überhaupt meinst? Löschen kann man erstmal sowieso nur nacheinander (Element für Element).
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden
X-FILE
Super JLI'ler



Anmeldedatum: 12.07.2003
Beiträge: 349

Medaillen: Keine

BeitragVerfasst am: 14.09.2003, 17:53    Titel: Antworten mit Zitat

Nein das ist so:

Ich habe Klasse a und Klasse b.

In Klasse a werden Objekte angelegt und gerendert. In Klasse b werden Kollisionen und KI aktiviert.
Jetzt isses so, dass ich in Klasse a eine Liste 1 erstelle mit Objekten die zum rendern gehen. Gleichzeitig erstelle ich in Klasse a eine Liste 1 1/2 (so in etwa Wink), die fuer Klasse 2 als Kollisionliste herhaelt. D.h. die hat die gleichen Objekte, wie Liste 1, dient nur einem anderen Zweck.

Wenn ich jetzt aus Liste 1 1/2 was loesche (mit delete), fehlt natuerlich Liste 1 ein Objekt, was aber ja noch da sein sollte. Es sollte als theoretisch in Liste 1 drinnen sein, ist aber physisch ja nicht mehr vorhanden.

Jetzt waere es natuerlich ideal, wenn man aus beiden Listen gleichzeitig das Objekt loeschen koennte.

Noch besser waere es, wenn ich nur die eine Liste 1 1/2 haette, die ich dann auch zum rendern nehmen kann. Nur wie kann ich diese Liste referenzieren in Klasse 1?? Ich bekomme immer Memoryfehler.....
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden
LeeDiGer
Super JLI'ler



Anmeldedatum: 31.08.2003
Beiträge: 366
Wohnort: Duisburg
Medaillen: Keine

BeitragVerfasst am: 14.09.2003, 18:22    Titel: Antworten mit Zitat

Ja und ddas Problem hatte ich auch. Aber da hatte ich ne richtig geniale Idee. Du kannst ein Hauptstruktur bzw. Klasse definieren (Die Struktur wird dann ein Element einer Liste sein). In der Hauptstruktur kannst du soviele Variablen, Strukturen und Listen abspeichern. Wenn du ein Element aus der Hauptliste löschst, dann werden eben alle Attribute des zu löschenden Objektes entfernt. Der Kniff liegt im Aufrufen der einzelnen Attribute. Dies geht alles noch über die Zeigerbefehle. Ich habs selbst getestet. Ich hab ein einer Hauptruktur mindestens 10 Sprites. Die Sprites werden auch über eine Klasse definiert. Ein Aufruf einer Funktion sieht etwa so aus:" Raumschiff->Sprite.Draw();" Wenn bei mir jetzt eine Shildaura gezeichnet werden soll:" Raumschiff->Schildaura.Draw();"

Das Löschen eines Raumschiffes funktioniert so wie du es kennst. Wenn du allerdings eine dynamische Struktur einbaust, musst du davon die Elemente erst einzeln löschen, bevor du ein Raumschiff entfernen kannst.
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden
X-FILE
Super JLI'ler



Anmeldedatum: 12.07.2003
Beiträge: 349

Medaillen: Keine

BeitragVerfasst am: 14.09.2003, 18:29    Titel: Antworten mit Zitat

Hmmm sorry,

du scheinst zwar eine Loesung zu haben, aber die verstehe ich nicht? Du haste eine Klasse gemacht, in der nur Listen gespeichert werden, oder wie?
Begreif ich irgendwie nicht..... Crying or Very sad
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden
TheMillenium
Dark JLI'ler



Anmeldedatum: 21.07.2002
Beiträge: 1427
Wohnort: World
Medaillen: Keine

BeitragVerfasst am: 14.09.2003, 19:08    Titel: Antworten mit Zitat

machs einfach ganz einfach! Wink

Im moment sieht's ungefähr so bei dir aus:

Klasse A:
...stuff...
liste

Klasse B:
...stuff...
liste

so würde ich's machen:

Klasse A:
...stuff...
zeiger auf liste

Klasse B:
...stuff...
zeiger auf liste

liste außerhalb im globalen Bereich oder in:

Klasse 0
liste
_________________
The source of all power is in its destiny...
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden
LeeDiGer
Super JLI'ler



Anmeldedatum: 31.08.2003
Beiträge: 366
Wohnort: Duisburg
Medaillen: Keine

BeitragVerfasst am: 14.09.2003, 19:36    Titel: Antworten mit Zitat

In der Klasse habe ich nicht nur Listen, sondern auch Klassen und normale Variablen abgespeichert. Man kann auch Zeiger abspeichern. Das habe ich u.a. auch. Man kann alles abspeichern.
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden
LeeDiGer
Super JLI'ler



Anmeldedatum: 31.08.2003
Beiträge: 366
Wohnort: Duisburg
Medaillen: Keine

BeitragVerfasst am: 14.09.2003, 19:44    Titel: Antworten mit Zitat

Klasse A und Klasse B sollten als Unterklassen definiert werden, wie ich es schon erklärt habe. Die Hauptklasse nenne ich jetzt Klasse H.
Dann sieht die Struktur folgendermaßen aus:

struct Klasse H
{
Klasse A
Klasse B
sonst. Stuff...
}

Klasse H wir als Element einer Liste definiert. Wenn ein Objekt gelöscht werden soll, dann werden beide Klassen und die sonstigen Attribute des Objektes gelöscht. Ich hoffe, die Idee wird hier jetzt verständlich.
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden
TheMillenium
Dark JLI'ler



Anmeldedatum: 21.07.2002
Beiträge: 1427
Wohnort: World
Medaillen: Keine

BeitragVerfasst am: 14.09.2003, 19:47    Titel: Antworten mit Zitat

@LeeDiGer:

Dann hattest du aber die zwei Raumschiffe aber direkt in der Raumschiff Klasse deklariert, ansonsten könntest du so nciht darauf zugreifen, außer du hast den Punkt Operator überladen. Das ist ein sehr riesengroßer Nachteil!!!

Oder zeig mal etwas grafisch den Klassen AUfbau also so:

Klasse
|
|----- Liste
|
|--- ...


oder so.

Denn in deinem Beitrag hast du ganz ganz schlecht erklärt, wie du das aufgebaut hast.

Du emintest du hättest einen vector únd im ersten Element wäre eine Struktur oder Klasse, das würde aber bedeuten, dass du ganz viele Klassen deklarieren würdest und das wäre ziemlich performanceauslastend...
_________________
The source of all power is in its destiny...
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden
X-FILE
Super JLI'ler



Anmeldedatum: 12.07.2003
Beiträge: 349

Medaillen: Keine

BeitragVerfasst am: 14.09.2003, 19:56    Titel: Antworten mit Zitat

Hallo,

freut mich, dass so zahlreiche Vorschlaege da sind!!

@Millenium:

Hmm ich hab eine aehnliche vorgehensweise wie du sie vorschlaegst probiert. Ich habe in Klasse a nur mit Zeigern auf Liste1 gearbeitet, aber das funktionierte nicht. Soll heißen, der Inhalt wurde nicht ausgelesen. Oder ist das was anderes, wenn ichs global mache und alle Klassen global drauf zu greifen??

BTW: gloab braeucht ich doch nur nen Header, der die Liste aufnimmt, oder nicht?

@Lee (darf ichs abkuerzen?):

Deine Variante scheint mir in Anbetracht der Masse an Funktionen und dem Aufbau fuer etwas nachteilig? Aber ich kucke mal, wenn du noch was schreiben solltest...
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden
TheMillenium
Dark JLI'ler



Anmeldedatum: 21.07.2002
Beiträge: 1427
Wohnort: World
Medaillen: Keine

BeitragVerfasst am: 14.09.2003, 20:15    Titel: Antworten mit Zitat

Wie hast du das gemacht?

Das sollte immer funktionieren, egal ob global oder lokal. SOfern du einmal Zurgiff auf die Adresse der Liste hast. Aber ich würde mir dann denn einen Zeiger auf das erste Elemente holen und wieviel es gibt.

Beispiel:

vector<int> IntVec;


int* p;
int p_elements;

p = &IntVec[0];

// Anzahl ELemente bestimmen...
for(int i=0;IntVec.size>i;i++)
p_elements++;


// Nun damit arbeiten

int* work = p;
for(int z=0;z<p_elements;z++)
{
work.Draw();
work++;
}
_________________
The source of all power is in its destiny...
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden
X-FILE
Super JLI'ler



Anmeldedatum: 12.07.2003
Beiträge: 349

Medaillen: Keine

BeitragVerfasst am: 14.09.2003, 20:35    Titel: Antworten mit Zitat

Hmm naja wie hab ichs gemacht... halt primaer mit iteratoren

Code:


Klasse a:

list<Objekte*> OList;

Objekte* o;

...list<Objekte*>::iterator obl;

for(obl = OList.begin(); obl != OList.end(); obl++)
{
(*obl)->Aktionen();
}

Klasse b:

Objekte* o2;

//Selber iteratorkram wie oben

for(obl = o2->OList.begin[usw])
{
(*obl)->WeitereAktionen();
}



Wobei das natuerlich dann nur bedingt richtig scheint? Es waren jedenfalls alle Aktionen in Klasse b leer. Also wurden nicht erkannt und die Liste hatte keine Objekte.
Dann waere deine Option wohl eine moegliche? Aber bei dir sind keine Iteratoren moeglich oder? Wie hab ich dann die Chance auf das jeweilige Listenobjekt zu kommen?
Und in welcher Klasse (also Klasse a oder b) ich die Liste definiere macht dann keinen Unterschied, oder?

NACHTRAG:
Also mein großes Problem ist es, auf eine Liste zuzugreifen, die nicht in einer Klasse angelegt wurde.

Ich habe es jetzt mit allem Moeglichen probiert, aber nichts funktioniert. Wie kriege ich denn den Zeiger in Klasse 2 auf eine Liste in Klasse 1? So dass ich auf den Inhalt der Liste von Klasse 1 in Klasse 2 zugreifen kann. Und natuerlich umgekehrt. Also in Klasse 2 Inhalte in die Liste von Klasse 1 schreiben.
Man das waere super, wenn da jmd. was hat?
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden
Beiträge der letzten Zeit anzeigen:   
Neues Thema eröffnen   Neue Antwort erstellen    JLI Spieleprogrammierung Foren-Übersicht -> Entwicklung Alle Zeiten sind GMT
Gehe zu Seite 1, 2, 3, 4, 5, 6  Weiter
Seite 1 von 6

 
Gehe zu:  
Du kannst keine Beiträge in dieses Forum schreiben.
Du kannst auf Beiträge in diesem Forum nicht antworten.
Du kannst deine Beiträge in diesem Forum nicht bearbeiten.
Du kannst deine Beiträge in diesem Forum nicht löschen.
Du kannst an Umfragen in diesem Forum nicht mitmachen.


Powered by phpBB © 2001, 2005 phpBB Group
Deutsche Übersetzung von phpBB.de

Impressum