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

GameProggD3D

Frischling

  • »GameProggD3D« ist der Autor dieses Themas

Beiträge: 67

Wohnort: Walding

Beruf: Schüler

  • Private Nachricht senden

1

06.07.2012, 22:45

std::map Debug Assertion Failed (map/set operators incompatible)

Hi,

Hab grad versucht, std::map zu verwenden, um Statuswerte zu speichern (status_map["attack"] = 25 zum Beispiel).
In meiner Klasse, wo ich die Map benutze, hab ich eine Funktion, die alle Statuswerte erhöhen soll.

C-/C++-Quelltext

1
2
3
4
5
6
7
8
9
10
void Status::Increase()
{
    map<string, StatValue>::iterator i;
    for(i = m_stat_map.begin(); 
        i != m_stat_map.end();
        ++i)
    {
        i->second.Increase();
    }
}



StatValue ist eine von mir angelegte Klasse mit den Variablen für den jetzigen Wert, den Grundwert, und den Wert, um den es erhöht wird. Es hat eine Methode Increase(), die den Erhöhungswert zum momentanen Wert hinzuzählt.
m_stat_map ist eine map<string, StatValue>, die als private Variable deklariert wurde.

Wenn ich das Programm ausführe, erhalte ich eine Errorbox mit:

Quellcode

1
2
3
Debug Assertion FailedProgram : ***Line: 321
Expression: map/set iterators incompatible
[Abbrechen] [Wiederholen] [Ignorieren]


Weiß jemand, woran das liegt? Und wie man es beheben kann?
Programmiere Zombie-Spiel mit nem Freund

David Scherfgen

Administrator

Beiträge: 10 382

Wohnort: Hildesheim

Beruf: Wissenschaftlicher Mitarbeiter

  • Private Nachricht senden

2

06.07.2012, 23:19

Mal unabhängig von dem Fehler, den ich jetzt nicht erklären kann:
Du solltest deine StatValue-Instanzen nicht direkt in der Map speichern, sondern Zeiger darauf.

GameProggD3D

Frischling

  • »GameProggD3D« ist der Autor dieses Themas

Beiträge: 67

Wohnort: Walding

Beruf: Schüler

  • Private Nachricht senden

3

07.07.2012, 09:49

Durch Debuggen hat sich Ergeben, dass der Fehler in xtree hier auftritt (in der for-Schleife ist das beim i!= end()):

C-/C++-Quelltext

1
2
3
4
5
6
7
 #if _ITERATOR_DEBUG_LEVEL == 2
        if (this->_Getcont() == 0
            || this->_Getcont() != _Right._Getcont())
            {   // report error
            _DEBUG_ERROR("map/set iterators incompatible");
            _SCL_SECURE_INVALID_ARGUMENT;
            }


Das obere wird von vom operatpr != aus aufgerufen:

C-/C++-Quelltext

1
2
3
4
5
bool operator!=(const _Myiter& _Right) const
        {   // test for iterator inequality
        return (!(*this == _Right));
        }
    };

Gibt es eine andere Möglichkeit, durch alle Elemente einer std::map zu iterieren?
Da anscheinend keiner die Lösung kennt?

EDIT: Es liegt auch nicht daran, dass ich StatValue in der Map verwende.
Folgender Code in einem anderen Projekt funktioniert problemlos:

C-/C++-Quelltext

1
2
3
4
5
6
7
8
9
10
11
12
int main()
{
    map<string, StatValue*> asdf;
    asdf.insert(pair<string, StatValue*>("manuel", &StatValue(12)));
    asdf.insert(pair<string, StatValue*>("manu", &StatValue(11)));

    for (map<string, StatValue*>::iterator i = asdf.begin(); i!=asdf.end(); ++i)
    {
        cout << i->first << " " << i->second->GetVal() << endl;
    }
    getchar();
}
Programmiere Zombie-Spiel mit nem Freund

Dieser Beitrag wurde bereits 2 mal editiert, zuletzt von »GameProggD3D« (07.07.2012, 10:13)


David Scherfgen

Administrator

Beiträge: 10 382

Wohnort: Hildesheim

Beruf: Wissenschaftlicher Mitarbeiter

  • Private Nachricht senden

4

07.07.2012, 10:17

Autsch. Was machst du denn da?
Du legst mit StatValue(12) ein neues Objekt auf dem Stack an und speicherst die Adresse in der Map.
Das geht, aber nur so lange du die Map nicht über die Funktion hinaus benutzt (dann müsstest du new benutzen, um das Objekt auf dem Heap anzulegen).

Ich glaube, dir fehlen noch einige Grundlagen was C++ angeht.
Wenn du C# nehmen würdest, müsstest du dich nicht mit sowas ärgern ;)

Kann es sein, dass die Map während des Iterierens irgendwie geändert wird, vielleicht sogar aus einem anderen Thread heraus?

Helmut

5x Contest-Sieger

Beiträge: 692

Wohnort: Bielefeld

  • Private Nachricht senden

5

07.07.2012, 11:07

Die Fehlermeldung bedeutet, dass du zwei Iteratoren vergleichst, die zu verschiedenen Containern gehören. Ist der Code, den du im ersten Post gezeigt hast, der Originale oder hast du was verändert?
Wenn es der Originale ist zeig mehr davon.
Vielleicht baust du auch mal ein compilierendes Minimalbeispiel. Ansonsten können wir nicht helfen, weil alles was du gezeigt hast nicht so einen Fehler produzieren kann.
Sei stets geduldig gegenüber Leuten, die nicht mit dir übereinstimmen. Sie haben ein Recht auf ihren Standpunkt - trotz ihrer lächerlichen Meinung. (F. Hollaender)

BurningWave

Alter Hase

Beiträge: 1 106

Wohnort: Filderstadt/Konstanz

Beruf: Student

  • Private Nachricht senden

6

07.07.2012, 13:38

Dein Interator ist wie folgt definiert:

C-/C++-Quelltext

1
map<string, StatValue>::iterator i;


Sicher, dass deine Map nicht einen String und einen Zeiger auf StatValue enthält?

David Scherfgen

Administrator

Beiträge: 10 382

Wohnort: Hildesheim

Beruf: Wissenschaftlicher Mitarbeiter

  • Private Nachricht senden

7

07.07.2012, 13:39

@BurningWave:
Nein, dann gäbe es einen Compilerfehler und keinen Laufzeitfehler.

Werbeanzeige