[c++][vector][g++] Vectorer vill inte bli kopierade/överskrivna?

Permalänk
Medlem

[c++][vector][g++] Vectorer vill inte bli kopierade/överskrivna?

Hej, jag har ett litet problem, jag kan ite få min vector att kopieras öven en annan och jag har inte en aning om vad som kan vara fel...

min kod ser (i stora drag) likadan ut som exempel koden som jag har, och den skall enligt utsago fungera.

void game::removeDeadObjects(){ object::objectVector tempVector; int tmpX; int tmpY; bool explode = false; for(object::objectVector::iterator i = mObjectVector.begin();\ i != mObjectVector.end(); i++ ){ object *tempObj = (*i); if(tempObj->isDead()){ if(tempObj->getClassification() != object::NONE){ tmpX = (*i)->getX(); tmpY = (*i)->getY(); explode = true; } else { tempVector.push_back(tempObj); } //mObjectVector.erase(mObjectVector.begin() + i); } } if(explode){ printf("a wild explosion!\n"); tempVector.push_back(new objectExplotion(tmpX,tmpY)); } mObjectVector = tempVector; printf("mObjectVector size: %i | tempVector size: %i \n", mObjectVector.size(), tempVector.size()); }

PS. ni kan ignorera printf() koden, den är bara till får debuging..

Visa signatur

@gegoxaren på identi.ca
min personliga Blag ^_^
#python #cSharp #php #sqlite #freetard #loonix

Permalänk

Det är lite svårt att förstå precis vilket problem som uppstår utifrån det du skrivit. Ett problem som du kanske kommer att ha med den där koden är att du invaliderar din iterator i när du tar bort något i mObjectVector. Nu är i och för sig den raden utkommenterad så det kanske inte är det problemet du tittar på just nu?

Borde inte också mObjectVector.erase(mObjectVector.begin() + i) bara vara mObjectVector.erase( i )?

Permalänk
Medlem

problemet är det att när jag kopierar vektorn så kopieras ingen tingen.
och när jag använder mObjectVector.erase(i) så får jag segmenteringsfel ty jag tar bort ett object och då slutar iteratron fungera.

alltså, dessutom så är den raden kod bort kommenterad...

Visa signatur

@gegoxaren på identi.ca
min personliga Blag ^_^
#python #cSharp #php #sqlite #freetard #loonix

Permalänk
Medlem

Jag kanse skall göra mig lite mer tydlig:

Jag vill kopiera en voktor till en annan.
Om jag tarbort objekt från vektorn så crashar spelet (Segmenteringnsfel).

froblemet uppstår när jag läggertill objectExplotion och objectExplotion::isDead() retunerar true så crachar spelet, inte för att det retunerar true utan för att det är det sista tillagda objectet i vectorn och då pekar iteratorn på ett icke exesterande objct.

Jag tänkte göra som min lärare visade i sina antekningar som vi fick som hjälp på vägen för att skapa spelet.

Det är altså denhär koden som inte fungerar:

void game::removeDeadObjects(){ int tmpX; int tmpY; bool explode = false; for(object::objectVector::iterator i = mObjectVector.begin();\ i != mObjectVector.end(); i++ ){ object *tempObj = (*i); if(tempObj->isDead()){ if(tempObj->getClassification() != object::NONE){ tmpX = (*i)->getX(); tmpY = (*i)->getY(); explode = true; } mObjectVector.erase(i); if(explode){ printf("a wild explosion!\n"); mObjectVector.push_back(new objectExplotion(tmpX,tmpY)); } } } //mObjectVector = tempVector; printf("mObjectVector size: %i\n", mObjectVector.size()); }

Visa signatur

@gegoxaren på identi.ca
min personliga Blag ^_^
#python #cSharp #php #sqlite #freetard #loonix

Permalänk
Medlem

Ok nu vet jag vad det var för fel....
jag hade placerad else satsen efter fel if satts...

void game::removeDeadObjects(){ object::objectVector tempVector; int tmpX; int tmpY; bool explode = false; for(object::objectVector::iterator i = mObjectVector.begin();\ i != mObjectVector.end(); i++ ){ object *tempObj = (*i); if(tempObj->isDead()){ if(tempObj->getClassification() != object::NONE){ tmpX = (*i)->getX(); tmpY = (*i)->getY(); explode = true; } //mObjectVector.erase(mObjectVector.begin() + i); } else { tempVector.push_back(tempObj); } if(explode){ tempVector.push_back(new objectExplotion(tmpX,tmpY)); } } mObjectVector = tempVector; }

skall det vara...

Visa signatur

@gegoxaren på identi.ca
min personliga Blag ^_^
#python #cSharp #php #sqlite #freetard #loonix