Runtime error pri mazani z vectoru – C / C++ – Fórum – Programujte.com
 x   TIP: Přetáhni ikonu na hlavní panel pro připnutí webu

Runtime error pri mazani z vectoru – C / C++ – Fórum – Programujte.comRuntime error pri mazani z vectoru – C / C++ – Fórum – Programujte.com

 

Kexo
~ Anonymní uživatel
3 příspěvky
3. 2. 2009   #1
-
0
-

Dobry den,
Kupil som si knihu 'Naucte se programovat pocitacove hry za 24 hodin' a pri testovani prikladov, po tom co som ich skompiloval z prilozenych zdrojakov dava runtime error ked sa v kode maze sprite z vectoru. Snazil som sa prist na to, co to moze sposobovat a na 90 % je to kod



// Handle the SA_KILL sprite action
if (saSpriteAction & SA_KILL)
{
// Notify the game that the sprite is dying
SpriteDying(*siSprite);
// Kill the sprite
delete (*siSprite);
m_vSprites.erase(siSprite);
siSprite--;
continue;
}

Nevie niekto cim by to mohlo byt a ako to vyriesit? V C++ sa ucim asi tri dni :/

Dakujem

Nahlásit jako SPAM
IP: 212.55.240.–
Quiark0
Věrný člen
3. 2. 2009   #2
-
0
-

Jo, to je super přístup učit se tak, že člověk opisuje kusy kódu a přitom z tomu vůbec ničemu nerozumí... Takhle nikam nedojdeš. Ta kniha už podle názvu vypadá nedůvěryhodně...

Runtime error ti to hází asi proto, že přistupuješ v paměti někam, kam nemáš, to znamená na místo, které sis nealokoval. To je obvykle způsobené použitím ukazatele, který ukazuje na neplatné místo, protože buď nebyl inicializován nebo objekt, na který ukazoval, už neexistuje.

Nahlásit jako SPAM
IP: 193.86.140.–
tmi0
Věrný člen
3. 2. 2009   #3
-
0
-

od pohledu bych tipl ze to bude proto ze siSprite bude nulovy (popr. nenulovy ale neplatny) pointer - pak by ale pricina chyby byla nekde jinde.
ukazal jsi dost malo kodu, z toho nelze jiste vyvodit nic, pokud neznam kontext, tedy jake hodnoty maji vstupni promenne a co delaji volane funkce. doporucuji ti pustit to nejakym debuggerem (treba gdb), ktery ti ukaze na kterem radku kodu to spadlo a muzes si nechat vypsat hodnoty promennych v dobe havarie.

hlavne nevim k cemu se vaze to continue - dost dobre muzes mit chybu v ridici podmince toho cyklu, ktera nezkontroluje ze uz si smazal posledni validni siSprite...

a presne jak rikal Quiark, zjisti si co ty kusy kodu maji delat, protoze i kdyz tu chybu najdeme, tobe to vlastne vubec nic neda. to uz si rovnou stahni zdrojak OpenAreny, zmen jmeno v titulcich a muzes machrovat zes nakodil hru.

Nahlásit jako SPAM
IP: 213.226.226.–
ksp.mff.cuni.cz -- doporučuje 5 z 0 přetečených bufferů!
Kexo
~ Anonymní uživatel
3 příspěvky
3. 2. 2009   #4
-
0
-

už to ide :D Naozaj išlo o zneplatnenie iterátoru, thx much, stačilo pridať riadok

if(siSprite -1 > m_vSprites.begin());

siSprite--;

A k tomu, že sa nič nenaučím, robil som len hru na základe enginu vytvoreného v knihe, ale keď to začalo errorovať skúsil som skompilovať príklady a tento bug tam bol tiež. Kniha nieje zlá, len názov je odveci a jediný jej veľký problém je, že občas nevysvetľuje dosť dôležité veci (ako napríklad so zneplatnením iterátoru).

Ďakujem za pomoc :)

Nahlásit jako SPAM
IP: 212.55.240.–
AdamHlavatovic0
Stálý člen
3. 2. 2009   #5
-
0
-

nazdar, tu knihu som mal tiez v ruke a v tom engine je chyba. Uz si to uplne presne nepametam, pretoze to bolo rok dozadu, ale upravoval som tieto dve metody:

void GameEngine::UpdateSprites()

{
// Update the sprites in the sprite vector
RECT rcOldSpritePos;
SPRITEACTION saSpriteAction;
vector<Sprite*>::iterator siSprite = m_vSprites.begin();

while (siSprite != m_vSprites.end())
{
// Save the old sprite position in case we need to restore it
rcOldSpritePos = (*siSprite)->GetPosition();

// Update the sprite
saSpriteAction = (*siSprite)->Update();

// Handle the SA_KILL sprite action
if (saSpriteAction & SA_KILL)
{
// Notify the game that the sprite is dying
SpriteDying(*siSprite);

// Kill the sprite
delete (*siSprite);

siSprite = m_vSprites.erase(siSprite);
continue;
}

// See if the sprite collided with any others
if (CheckSpriteCollision(*siSprite))
// Restore the old sprite position
(*siSprite)->SetPosition(rcOldSpritePos);

++siSprite;
}
}


a

void GameEngine::CleanupSprites()

{
// Delete and remove the sprites in the sprite vector
vector<Sprite*>::iterator siSprite;
for (siSprite = m_vSprites.begin(); siSprite != m_vSprites.end();
siSprite++)
{
delete (*siSprite);
}

m_vSprites.clear();
}


Bol tam problem s nekorektnym odstranovanim prvkou vektora. Kniha je inak dobra, takze kludne pokracuj v citani. Este jednu taku malickost obsahuje ten engine, a to ze zatazuje cpu na 100%. Matne si spominam, ze som to riesil pouzitim casovaca. Pripajam preto kod z 19 kapitoly, hra meteordefense, ak chces tak sa nato mrkni.

Nahlásit jako SPAM
IP: 94.229.32.–
Kexo
~ Anonymní uživatel
3 příspěvky
3. 2. 2009   #6
-
0
-

Dakujem.

Nahlásit jako SPAM
IP: 212.55.240.–
Zjistit počet nových příspěvků

Přidej příspěvek

Toto téma je starší jak čtvrt roku – přidej svůj příspěvek jen tehdy, máš-li k tématu opravdu co říct!

Ano, opravdu chci reagovat → zobrazí formulář pro přidání příspěvku

×Vložení zdrojáku

×Vložení obrázku

Vložit URL obrázku Vybrat obrázek na disku
Vlož URL adresu obrázku:
Klikni a vyber obrázek z počítače:

×Vložení videa

Aktuálně jsou podporována videa ze serverů YouTube, Vimeo a Dailymotion.
×
 
Podporujeme Gravatara.
Zadej URL adresu Avatara (40 x 40 px) nebo emailovou adresu pro použití Gravatara.
Email nikam neukládáme, po získání Gravatara je zahozen.
-
Pravidla pro psaní příspěvků, používej diakritiku. ENTER pro nový odstavec, SHIFT + ENTER pro nový řádek.
Sledovat nové příspěvky (pouze pro přihlášené)
Sleduj vlákno a v případě přidání nového příspěvku o tom budeš vědět mezi prvními.
Reaguješ na příspěvek:

Uživatelé prohlížející si toto vlákno

Uživatelé on-line: 0 registrovaných, 119 hostů

Moderátoři diskuze

 

Hostujeme u Českého hostingu       ISSN 1801-1586       ⇡ Nahoru Webtea.cz logo © 20032024 Programujte.com
Zasadilo a pěstuje Webtea.cz, šéfredaktor Lukáš Churý