Panel użytkownika
Nazwa użytkownika:
Hasło:
Nie masz jeszcze konta?

[C++]Expression: list iterators incompatible

Ostatnio zmodyfikowano 2013-06-04 20:26
Autor Wiadomość
Sawair
Temat założony przez niniejszego użytkownika
[C++]Expression: list iterators incompatible
» 2013-06-01 14:46:13
Podczas wywoływania tej funkcji w programie, po pierwszym if'ie wywala błąd z obrazku.
C/C++
void Mob::przeekwipuj()
{
    char wybrany;
    int ktory;
    if( myZbroja != myPancerz.end() )
    {
        myKp -= myZbroja->tyleKP();
    }
    if( myTarcza != myPancerz.end() )
    {
        myKp -= myTarcza->tyleKP();
        myKpNPanc -= myTarcza->tyleKP();
    }
    cout << "Przekwipowywujesz " << myName << endl
    << "Oto moje pancerze: \n";
    wypisz_pancerze();
    cout << "Wybierz pancerz, lub jesli nie ma, badz go nie chcesz wpisz \"X\": ";
    cin >> wybrany;
    if( wybrany != 'X' )
    {
        ktory =( int ) wybrany;
        auto iElement = myPancerz.begin();
        for( int i = 0; i < ktory; i++ )
        {
            ++iElement;
        }
        myZbroja = iElement;
        myKp += myZbroja->tyleKP();
    }
    cout << "Wybierz tacze, lub jesli jej nie ma, badz jej nie chcesz wpisz \"X\": ";
    cin >> wybrany;
    if( wybrany != 'X' )
    {
        ktory =( int ) wybrany;
        auto iElement = myPancerz.begin();
        for( int i = 0; i < ktory; i++ )
        {
            ++iElement;
        }
        myTarcza = iElement;
        myKp += myTarcza->tyleKP();
        myKpNPanc += myTarcza->tyleKP();
    }
}
Dodam jeszcze konstruktor obiektu:
C/C++
Mob::Mob( int itsNumer, string itsName, int itsKpNTarcz, list < Pancerz > & itsPancerz, list < Bron > & itsBron )
{
   
    myNumer = itsNumer;
    myName = itsName;
    myKpNTarcz = itsKpNTarcz;
    myKpNPanc = itsKpNTarcz;
    myKp = itsKpNTarcz;
    mynPancerzy = itsPancerz.size();
    mynBroni = itsBron.size();
    for( Pancerz & Element: itsPancerz )
    {
        myPancerz.push_back( Element );
    }
    for( Bron & Element: itsBron )
    {
        myBron.push_back( Element );
    }
    myZbroja = myPancerz.end();
    myTarcza = myPancerz.end();
};
Tak więc jest ktoś w stanie mi powiedzieć gdzie jest błąd, że zawsze mi przed if'em wywala ten komunikat?
P-84530
Monika90
» 2013-06-01 15:09:42
Prawdopodobnie porównujesz iteratory, które należa do dwóch różnych list, albo jeden z nich jest nieważny.

Ten kod nie wygląda dobrze:
C/C++
cin >> wybrany;
if( wybrany != 'X' )
{
    ktory =( int ) wybrany;
    auto iElement = myPancerz.begin();
    for( int i = 0; i < ktory; i++ )
    {
        ++iElement;
    }
przesuwa on iterator o ilośc pozycji równą kodowi znaku wprowadzonego z klawiatury.
P-84533
Sawair
Temat założony przez niniejszego użytkownika
» 2013-06-01 15:30:40
Chodziło mi o pierwszego if'a.
C/C++
void Mob::przeekwipuj()
{
    char wybrany;
    int ktory;
    if( myZbroja != myPancerz.end() )
    {
        myKp -= myZbroja->tyleKP();
    }
Ma on sprawdzić czy iterator wskazuje jakiś element listy myPancerz i od zmiennej Mob'a odjąć wartość zwracana przez funkcje tyleKP(). Za każdym razem kiedy element spod iteratora jest usuwany, myZbroja wskazuje koniec listy myPancerz. A tak w ogóle to iterator w tym miejscu jest użyty po raz 2, tz po wywołaniu konstruktora wywołuję funkcje przeekwipuj()...
P-84535
DejaVu
» 2013-06-04 20:26:14
Możliwe warianty zostały wymienione przez @Monika90. Być może gdzieś kopiujesz listę albo robisz inne dziwne rzeczy, które sprawiają, że Twój iterator jest niepoprawny.
P-84859
« 1 »
  Strona 1 z 1