Du bist nicht angemeldet.

Stilllegung des Forums
Das Forum wurde am 05.06.2023 nach über 20 Jahren stillgelegt (weitere Informationen und ein kleiner Rückblick).
Registrierungen, Anmeldungen und Postings sind nicht mehr möglich. Öffentliche Inhalte sind weiterhin zugänglich.
Das Team von spieleprogrammierer.de bedankt sich bei der Community für die vielen schönen Jahre.
Wenn du eine deutschsprachige Spieleentwickler-Community suchst, schau doch mal im Discord und auf ZFX vorbei!

Werbeanzeige

1

30.08.2008, 16:44

komischer List Fehler

Hallo,

und zwar habe ich einen für mich unaufspürbaren List Fehler.
Ich habe eine List voll mit Klassen, die eine Variable Namens choose enthält.
Choose entspricht der der gewählten Objekt, also kann nur eine Intanz Choose auf true haben.
zB so (abstrakt) :
(0,0,0,1,0,0) -> Die vierte Objekt ist gewählt.
Ich will diese eine jetzt verschieben ( andere Instanz wählen)und zwar so:
(0,0,0,0,1,0)

Und das mit diesem Code:

C-/C++-Quelltext

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
    std::list<CStatic*>::iterator i;
    m_itChoose = m_spriteStaticList.begin();  //m_itChoose ist schon definiert

    i = m_spriteStaticList.begin();
    while((*i)->GetChoose()==false)  // an welcher Stelle ist true 

    {
        m_itChoose++;                   // hat am Ende die stelle mit true

        i++;
    }
    i = m_spriteStaticList.begin();
    for(i = m_spriteStaticList.begin(); i != m_spriteStaticList.end(); i++)
    {
        (*i)->Choose(false);           // alles auf false setzen

    }
    if(m_itChoose == m_spriteStaticList.end())       // wenn ende, zutück und true

    {
        m_itChoose=m_spriteStaticList.begin();
        (*m_itChoose)->Choose(true);
    }
    else                                                            // sont eins weiter und true

    {
        m_itChoose++;
        (*m_itChoose)->Choose(true);
    }


So habe ich mir das gedacht:
drei objekte o einer is true (o):

o o (o)
while schleife läuft zwei mal durch darum hat itChoose jetzt die dritte Instanz.
Alles auf false

o o o

itChoose ist am Ende, wieder zurücksetzten und true:

(o) o o

klappt aber net ;), da kommt ein Laufzeitfehler ?

Wieso ist das so, bitte um Hilfe

MfG Unknown

Das Gurke

Community-Fossil

Beiträge: 1 996

Wohnort: Pinneberg

Beruf: Schüler

  • Private Nachricht senden

2

30.08.2008, 16:49

Ohne mir jetzt den Code angesehen zu haben: eine Liste ist dafür irgendwie ein unpassender Datentyp. Ich würd mir nen Vektor nehmen ;)

drakon

Supermoderator

Beiträge: 6 513

Wohnort: Schweiz

Beruf: Entrepreneur

  • Private Nachricht senden

3

30.08.2008, 16:56

C-/C++-Quelltext

1
2
3
4
5
    while((*i)->GetChoose()==false)  // an welcher Stelle ist true

    {
        m_itChoose++;                   // hat am Ende die stelle mit true

        i++;
    } 

Das hier ist sicher schonmal sehr komisch.

Was ist den jetzt, wenn alle Elemente in der Liste true sind? - Dann wirst du einen Zugriff auf eine Variable haben, die keine ist.

Mal abgesehen davon, kannst du diese Funktion sehr viel einfacher schreiben. ;)
Probier das ganze mal in einer einzigen Schlaufe zu machen.

Achja. Die Fehler, die du bekommst immer möglichst genau posten.

EDIT:
Gibt das sowas, wie einen Balken, wo ein Zeichen hin und her geht?
(Könntest auch mal überlegen, wie du es machen würdest, wenn du mehrere Elemente im Container hast. )

4

30.08.2008, 17:01

Es ist aber nur EINE true ;)

Nein, das ist nen Level-Editor, wo man sich ein Objekt raussuchen muss, um es zu ändern, darum ist auch nur eins true ;)

Laufzeitfehler:
list itterator not deferenceable

Und beim ersten Aufruf der Funktion kommt der Fehler bei der ersten If abfrage.
(*m_itChoose)->Choose(true);

5

30.08.2008, 17:17

Vllt. ist das, was du brauchst:

C-/C++-Quelltext

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
#include <list>
#include <algorithm>
#include <iterator>

int main()
{
    // fill sample list

    std::list<bool> list(3, false);
    std::list<bool>::iterator it(list.begin());
    std::advance(it, 1);
    *it = true;

    // show before rotation

    std::copy(list.begin(), list.end(), std::ostream_iterator<bool>(std::cout, " "));
    // rotate

    std::rotate(list.begin(), it, list.end());
    // show after rotation

    std::copy(list.begin(), list.end(), std::ostream_iterator<bool>(std::cout, " "));
}
...
Devil Entertainment :: Your education is our inspiration
Der Spieleprogrammierer :: Community Magazin
Merlin - A Legend awakes :: You are a dedicated C++ (DirectX) programmer and you have ability to work in a team? Contact us!
Siedler II.5 RttR :: The old settlers-style is comming back!

Also known as (D)Evil

drakon

Supermoderator

Beiträge: 6 513

Wohnort: Schweiz

Beruf: Entrepreneur

  • Private Nachricht senden

6

30.08.2008, 17:26

Zitat von »"Unknown"«

Es ist aber nur EINE true ;)

Nein, das ist nen Level-Editor, wo man sich ein Objekt raussuchen muss, um es zu ändern, darum ist auch nur eins true ;)

Laufzeitfehler:
list itterator not deferenceable

Und beim ersten Aufruf der Funktion kommt der Fehler bei der ersten If abfrage.
(*m_itChoose)->Choose(true);


Ja. Und jetzt überleg dir nochmal, was ich dir gepostet habe oben. Wo ich den Fehler vermute.

7

30.08.2008, 17:49

hmm , du hast geschrieben wenn alle true sind, dass ich eine Variable die keine ist bekomme ;)

Da aber das bei mir nicht der Fall ist...
Ich sehe keinen Fehler :?:

@ deviloper: das mit true-list geht schonmal gar net, da ich das nur abstrakt gezeigt habe.
Ich möchte nicht die Variable "tauschen", nur umsezten.
Sprich wenn objekt drei die Membervariable choose auf true hat, soll dann objekt vier das auf true bekommen und drei auf false.

8

30.08.2008, 18:24

Achso ... ne man tauscht damit auch nicht, sondern rotiert in der Liste, d.h. 1. Element = 1 + n, 2. Element = 2 + n usw ;)
Devil Entertainment :: Your education is our inspiration
Der Spieleprogrammierer :: Community Magazin
Merlin - A Legend awakes :: You are a dedicated C++ (DirectX) programmer and you have ability to work in a team? Contact us!
Siedler II.5 RttR :: The old settlers-style is comming back!

Also known as (D)Evil

9

30.08.2008, 18:27

Das ist aber nicht das was ich brauche, vllt erklär ich auch zu umständlich :D

Also:

zB 5 Objekte, alle gleich, alle haben die Membervariable choose.
Es hat nur EIN Objekt Choose auf true, die anderen auf false.
Ein Objekt wird jetz mit o dargestellt, das objekt mit choose == true mit (o).
Also, die Objekte haben eine Feste Postition in der Liste, nur true wird "weitergegeben".

zB :
o o (o) o o
o o o (o) o
o o o o (o)
(o) o o o o
etc..

S.Seegel

2x Contest-Sieger

  • Private Nachricht senden

10

30.08.2008, 18:43

Dein Code verursacht an mehreren Stellen Laufzeitfehler.

1. In der Schleife, die das Element sucht, dessen GetChoose()-Methode true liefert.
Sollte wider Erwarten kein Element true liefern, bricht die Schleife nicht ab, inkrementiert den Iterator jenseits des letzten Elements der Liste und dereferenziert ihn.

2. Im if-else-Zweig, der das nächste Element auswählen soll.
m_itChoose kann nicht gleich m_spriteStaticList.end() sein, da List.end() einen Iterator auf das Element nach dem letzten Element in der Liste liefert, also jenseits der Liste zeigt.
Es wird also immer der else-Zweig ausgeführt. Und in dem wird der Iterator inkrementiert, was einen Iterator auf das letzte Element innerhalb der Liste jenseits der Liste zeigen lässt, und dann dereferenziert.

Wenn ich mir deinen Code so ansehe, soll m_itChoose immer auf das aktuell ausgewählte Element zeigen. Und du möchtest diesen Iterator ein Element weiter rücken.
Nichts einfacher als das:

C-/C++-Quelltext

1
2
3
4
5
6
7
// aktuell ausgewähltes Element abwählen

(*m_itChoose)->Choose(false);
// Iterator weiter rücken und prüfen, ob wir jenseits der Liste gelandet sind

if (++m_itChoose == m_spriteStaticList.end())
    m_itChoose = m_spriteStaticList.begin();  // falls wir jenseits der Liste gelandet sind zurück auf Anfang

// dieses Element auswählen

(*m_itChoose)->Choose(true);

Solange du zwischenzeitlich nicht das Element, auf das der Iterator verweist, löscht, funktioniert das. Das ist nämlich einer der Vorteile von list im Vergleich zum vector: Iteratoren bleiben auch über die Liste verändernde Operationen hinweg gültig (mit Ausnahme von Iteratoren auf gelöschte Elemente).

Werbeanzeige