• Najnowsze pytania
  • Bez odpowiedzi
  • Zadaj pytanie
  • Kategorie
  • Tagi
  • Zdobyte punkty
  • Ekipa ninja
  • IRC
  • FAQ
  • Regulamin
  • Książki warte uwagi

Błąd “vector iterator not decrementable”?

Object Storage Arubacloud
0 głosów
128 wizyt
pytanie zadane 29 grudnia 2016 w C i C++ przez karmider013 Początkujący (340 p.)

Witam,

Od pewnego czasu borykam się z problemem w mojej mini grze. W kodzie tworzę vector którego następnie wypełniam dziesięcioma sprite'ami. Ich ruch polega na sprawdzaniu czy pierwszy z lewej przeciwnik doleciał do lewej lub prawej krawędzi, jeśli tak to obniżam ich wysokość i zmieniam kierunek ruchu. Problem pojawia się przy kolizji pocisku z wrogiem, kiedy pocisk trafi statek to usuwam go z vectora jednak w praktyce kompilator wyrzuca mi taki oto błąd: “vector iterator not decrementable”. Wiem ,że chodzi o problem z pierwszym statkiem w vecotrze, bo kiedy  w pętli for w której wykrywane jest zderzenie zmienię "środkowy" argument na it > tab.begin();  to gra śmiga tylko, że pierwszy minionek w ogóle nie reaguje na pocisk

 

Zderzenie pocisku z minionkiem
		for (auto it = tab.end() - 1; it >= tab.begin(); --it)
		{
			if (sprite_bullet.getGlobalBounds().intersects(it->getBound()))
			 it=tab.erase(it);
		}

// Enemy movment
		if (flag_min == true)
			{
				for (int i = 0; i <= tab.size() - 1; i++)
				{
					tab[i].movel(time);
				}

			}

		

// dojscie minionka do lewej krawedzi
	
					Enemy im = tab.front();
					if (im.getPosX() <= -10)
					{
						flag_min = false;
						for (int i = 0; i <= tab.size() - 1; i++)
						{
							tab[i].spos(tab[i].getPosX(), tab[i].getPosY());
						}
					}
				

				if (flag_min == false)
				{
					for (int i = 0; i <= tab.size() - 1; i++)
					{
						tab[i].movep(time);
					}
				}

// dojscie minionka do prawej krawedzi
	
					Enemy en = tab.back();
					if (en.getPosX() >= 750)
					{
						flag_min = true;
						for (int i = 0; i <= tab.size() - 1; i++)
						{
							tab[i].spos(tab[i].getPosX(), tab[i].getPosY());
						}
					}
				

Przesyłam również zdjęcie gry, żeby lepiej zorganizować cała sytuację:

 

Tak wygląda gra jak zmienię w pętli for argument z  it >= tab.begin(); na  it > tab.begin();, bo w przypadku pierwszym gra się w ogóle nie włącza.

 

Jeśli potrzebujecie więcej kodu to tylko napiszcie, a wyślę.

1 odpowiedź

0 głosów
odpowiedź 29 grudnia 2016 przez playerony Pasjonat (15,240 p.)
Tak lepiej iterować wektor w drugą stronę:

for (std::vector<coś_tam>::reverse_iterator it = persons.rbegin(); it != persons.rend(); ++it)

Przy twoim sposobie pomijana jest jedna wartość.
komentarz 30 grudnia 2016 przez karmider013 Początkujący (340 p.)
Tylko, że wtedy kiedy trafię wroga z prawej strony (ostatniego w vectorze) to znów wywala mi ten sam błąd, czyli nic się nie zmieni oprócz tego ,że problemem będzie minionek z prawej strony a nie z lewej.
komentarz 30 grudnia 2016 przez playerony Pasjonat (15,240 p.)
A tak ?

for(vector<coś_tam>::iterator it = value.begin() ; it!=value.end() ; ++it)

Jak już tak nie zadziała to nie wiem

Podobne pytania

0 głosów
1 odpowiedź 418 wizyt
pytanie zadane 19 marca 2019 w C i C++ przez Hiskiel Pasjonat (22,830 p.)
0 głosów
1 odpowiedź 396 wizyt
pytanie zadane 30 marca 2017 w C i C++ przez Milesq Nałogowiec (32,020 p.)
0 głosów
4 odpowiedzi 498 wizyt
pytanie zadane 31 maja 2017 w C i C++ przez Programeł Gaduła (3,500 p.)

92,555 zapytań

141,403 odpowiedzi

319,557 komentarzy

61,940 pasjonatów

Motyw:

Akcja Pajacyk

Pajacyk od wielu lat dożywia dzieci. Pomóż klikając w zielony brzuszek na stronie. Dziękujemy! ♡

Oto polecana książka warta uwagi.
Pełną listę książek znajdziesz tutaj.

Akademia Sekuraka

Kolejna edycja największej imprezy hakerskiej w Polsce, czyli Mega Sekurak Hacking Party odbędzie się już 20 maja 2024r. Z tej okazji mamy dla Was kod: pasjamshp - jeżeli wpiszecie go w koszyku, to wówczas otrzymacie 40% zniżki na bilet w wersji standard!

Więcej informacji na temat imprezy znajdziecie tutaj. Dziękujemy ekipie Sekuraka za taką fajną zniżkę dla wszystkich Pasjonatów!

Akademia Sekuraka

Niedawno wystartował dodruk tej świetnej, rozchwytywanej książki (około 940 stron). Mamy dla Was kod: pasja (wpiszcie go w koszyku), dzięki któremu otrzymujemy 10% zniżki - dziękujemy zaprzyjaźnionej ekipie Sekuraka za taki bonus dla Pasjonatów! Książka to pierwszy tom z serii o ITsec, który łagodnie wprowadzi w świat bezpieczeństwa IT każdą osobę - warto, polecamy!

...