Vorheriges Thema anzeigen :: Nächstes Thema anzeigen |
Autor |
Nachricht |
X-FILE Super JLI'ler
Anmeldedatum: 12.07.2003 Beiträge: 349
Medaillen: Keine
|
Verfasst am: 14.09.2003, 16:28 Titel: Fehler mit Liste |
|
|
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 |
|
 |
LeeDiGer Super JLI'ler

Anmeldedatum: 31.08.2003 Beiträge: 366 Wohnort: Duisburg Medaillen: Keine
|
Verfasst am: 14.09.2003, 16:38 Titel: |
|
|
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 |
|
 |
X-FILE Super JLI'ler
Anmeldedatum: 12.07.2003 Beiträge: 349
Medaillen: Keine
|
Verfasst am: 14.09.2003, 16:48 Titel: |
|
|
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 |
|
 |
X-FILE Super JLI'ler
Anmeldedatum: 12.07.2003 Beiträge: 349
Medaillen: Keine
|
Verfasst am: 14.09.2003, 17:06 Titel: |
|
|
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 |
|
 |
LeeDiGer Super JLI'ler

Anmeldedatum: 31.08.2003 Beiträge: 366 Wohnort: Duisburg Medaillen: Keine
|
Verfasst am: 14.09.2003, 17:26 Titel: |
|
|
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 |
|
 |
X-FILE Super JLI'ler
Anmeldedatum: 12.07.2003 Beiträge: 349
Medaillen: Keine
|
Verfasst am: 14.09.2003, 17:53 Titel: |
|
|
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 ), 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 |
|
 |
LeeDiGer Super JLI'ler

Anmeldedatum: 31.08.2003 Beiträge: 366 Wohnort: Duisburg Medaillen: Keine
|
Verfasst am: 14.09.2003, 18:22 Titel: |
|
|
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 |
|
 |
X-FILE Super JLI'ler
Anmeldedatum: 12.07.2003 Beiträge: 349
Medaillen: Keine
|
Verfasst am: 14.09.2003, 18:29 Titel: |
|
|
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.....  |
|
Nach oben |
|
 |
TheMillenium Dark JLI'ler
Anmeldedatum: 21.07.2002 Beiträge: 1427 Wohnort: World Medaillen: Keine
|
Verfasst am: 14.09.2003, 19:08 Titel: |
|
|
machs einfach ganz einfach!
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 |
|
 |
LeeDiGer Super JLI'ler

Anmeldedatum: 31.08.2003 Beiträge: 366 Wohnort: Duisburg Medaillen: Keine
|
Verfasst am: 14.09.2003, 19:36 Titel: |
|
|
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 |
|
 |
LeeDiGer Super JLI'ler

Anmeldedatum: 31.08.2003 Beiträge: 366 Wohnort: Duisburg Medaillen: Keine
|
Verfasst am: 14.09.2003, 19:44 Titel: |
|
|
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 |
|
 |
TheMillenium Dark JLI'ler
Anmeldedatum: 21.07.2002 Beiträge: 1427 Wohnort: World Medaillen: Keine
|
Verfasst am: 14.09.2003, 19:47 Titel: |
|
|
@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 |
|
 |
X-FILE Super JLI'ler
Anmeldedatum: 12.07.2003 Beiträge: 349
Medaillen: Keine
|
Verfasst am: 14.09.2003, 19:56 Titel: |
|
|
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 |
|
 |
TheMillenium Dark JLI'ler
Anmeldedatum: 21.07.2002 Beiträge: 1427 Wohnort: World Medaillen: Keine
|
Verfasst am: 14.09.2003, 20:15 Titel: |
|
|
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 |
|
 |
X-FILE Super JLI'ler
Anmeldedatum: 12.07.2003 Beiträge: 349
Medaillen: Keine
|
Verfasst am: 14.09.2003, 20:35 Titel: |
|
|
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 |
|
 |
|