Chyba s vektorem: _SCL_SECURE_VALIDATE(this->_Has_container()); – C / C++ – Fórum – Programujte.com
 x   TIP: Přetáhni ikonu na hlavní panel pro připnutí webu

Chyba s vektorem: _SCL_SECURE_VALIDATE(this->_Has_container()); – C / C++ – Fórum – Programujte.comChyba s vektorem: _SCL_SECURE_VALIDATE(this->_Has_container()); – C / C++ – Fórum – Programujte.com

 

Pepa
~ Anonymní uživatel
84 příspěvků
17. 12. 2010   #1
-
0
-

Zdravím, rád bych se zeptal na tuto chybu. Programuju pomocí knížky: "Naučte se programovat počítačové hry za 24 hodin"
C++ až tak extrémně neznám abych si poradil s tímto problémem. Využívá se tam #include <vector> kompilace je v pořádku jen když to spustím tak mi to vypíše chybovou hlášku:

Debug Assertion Failed!

Program <bla bla bla> \include\vector
Line 138

Expresion ("this->Has_container()", 0)

<bla bla bla>
|Přerušit|Opakovat|Přeskočit|

Zde to kolem toho žádku v <vector>:

_Myt& operator--()
{ // predecrement
_SCL_SECURE_VALIDATE(this->_Has_container());

Hledal jsem na netu a všude možně ale našel jsem sice spoustu věcí na tohle téma ale i přesto si nedokážu poradit (např: http://www.daniweb.com/forums/thread170062.html) Furt píší něco o nějaké inkrementaci a podobně ale nevím jak s tím naložit v programu.

Díky moc...
_SCL_SECURE_VALIDATE_RANGE(_Myptr > ((_Myvec *)(this->_Getmycont()))->_Myfirst);

Nahlásit jako SPAM
IP: 217.112.172.–
KIIV
~ Moderátor
+43
God of flame
17. 12. 2010   #2
-
0
-

dej sem kod.. z utrzku co si sem dal, nepozname nic, krom toho ze mas problem s nejakou pameti nebo kdo vi cim

Nahlásit jako SPAM
IP: 62.168.56.–
Program vždy dělá to co naprogramujete, ne to co chcete...
Pepa
~ Anonymní uživatel
84 příspěvků
17. 12. 2010   #3
-
0
-

Používá se to na Sprity(kolize) Zdrojáky dám na "leteckaposta.cz"
Zde (zip):

http://leteckaposta.cz/868661726

Bude to tak lepší jelikož se to používá v jednom ale pro jistotu dám ještě pár navíc které s tím souvisí (můžou)

Nahlásit jako SPAM
IP: 217.112.172.–
KIIV
~ Moderátor
+43
God of flame
17. 12. 2010   #4
-
0
-

nj sem to chtel zkompilovat a prohnat valgrindem.. ten vetsinou aspon zmini co se deje :D

Nahlásit jako SPAM
IP: 94.142.234.–
Program vždy dělá to co naprogramujete, ne to co chcete...
Pepa
~ Anonymní uživatel
84 příspěvků
17. 12. 2010   #5
-
0
-

Jestli chceš můžu ti dodat celý "program" (omlouvám se za spousty comentů, ale jsou tam příklady a pod z jinačích ukázkových her z té knížky) tak to můžeš vyzkoušet co s tím.

Nahlásit jako SPAM
IP: 217.112.172.–
KIIV
~ Moderátor
+43
God of flame
17. 12. 2010   #6
-
0
-

To Pepa : jo je to pak jednodussi zjistovat chyby

Nahlásit jako SPAM
IP: 94.142.234.–
Program vždy dělá to co naprogramujete, ne to co chcete...
Pepa
~ Anonymní uživatel
84 příspěvků
17. 12. 2010   #7
-
0
-

To KIIV :

Zde (zip):
http://leteckaposta.cz/235633044

Nahlásit jako SPAM
IP: 217.112.172.–
KIIV
~ Moderátor
+43
God of flame
17. 12. 2010   #8
-
0
-

hm tak to se mi asi jen tak na linuxu prelozit nepovede...
bude to chtit spustit v debug rezimu a trochu krokovat nebo tak

Nahlásit jako SPAM
IP: 94.142.234.–
Program vždy dělá to co naprogramujete, ne to co chcete...
Pepa
~ Anonymní uživatel
84 příspěvků
17. 12. 2010   #9
-
0
-

To KIIV : To KIIV : Je to v Visual Studiu 2008 kdyby něco ;)
K linkeru jsem přidával ještě: winmm.lib msimg32.lib a pro zobrazování textu "Use Multi-Byte Character Set"

Díky za pomoc

Nahlásit jako SPAM
IP: 217.112.172.–
Pepa
~ Anonymní uživatel
84 příspěvků
18. 12. 2010   #10
-
0
-

No každopádně pro zjednodušení tu ukážu hru, která byla k tomu jako příklad. Je to všechno děláno na starším visualku, chybu to nedělá jak je to tam zkompilované, ale jakmile to otevřu v VS 2008 tak to pak blbne to s tím "containerem"... každopádně zde k chybě dojde v okamžiku KOLIZE rakety a meteoritu. (Pro usnadnění hledání chyby). Vše je dělané jako WinApi.

http://leteckaposta.cz/121847013

;) Zkus se na to prosím podívat. Dík

Nahlásit jako SPAM
IP: 217.112.172.–
ian0
Stálý člen
18. 12. 2010   #11
-
0
-

Nepouštěl jsem to, mám linux. Ale podle popisu mně bylo hned jasný odkud vítr fouká. Pohledem do kódu jsem rychle objevil chybu. V souboru GameEngine.cpp v metodě UpdateSprites na řádku 380 se volá erase na vectoru spritů. Jenže erase na vectoru invaliduje všechny iterároty od rušeného prvku (včetně) dál. Lišácké siSprite-- na dalším řádku se tedy chová nedefinovaně. Je možné, že to staré VS skouslo a v novém už to odletí. Každopádně na invalidovaný iterátory se prostě nesmí sahat. Erase proto vrací validní iterátor, který se pak dá použít.

Btw, autorův přístup k c++ je imo (mírně řečeno) špatný. Používá postfixové operátory inc a dec místo prefixových i tam, kde to není třeba. Vůbec nepoužívá konstantí objekty a metody. Některé identifikátory obsahují _ na začátku, což je zakázané normou. Ať přístě raději píše v javě, učetří tím čtenářům nervy a sobě čas.

Nahlásit jako SPAM
IP: 89.24.135.–
-- ian
Pepa
~ Anonymní uživatel
84 příspěvků
19. 12. 2010   #12
-
0
-

To ian : Njn tak ta knížka je trochu starší už, ale tak hodí se a + - to funguje :P No sice tohle je hezké tohle mi říkali i jinde že incrementuju iterátor ale problém je že já nevím pořádně co s tím, ty GameEngine.cpp a pod jen "využívám" ale neměním je takže nevím pořádně co s něma a jak to mám opravit, aby to fungovalo. Nedělám s tím nic velkého a něco co by muselo být úplně bezchybné a podobně, stačí mi když to bude fungovat tak proto se ptám: Co přesně s tím? Takže to nemám inkrementovat? Dík

BTW: Ses díval na tu jeho práci která k tomu byla přidaná jak jsem postoval jako poslední že?

Nahlásit jako SPAM
IP: 217.112.172.–
ian0
Stálý člen
19. 12. 2010   #13
-
0
-

Pepa napsal:
To ian : Njn tak ta knížka je trochu starší už, ale tak hodí se a + - to funguje :P No sice tohle je hezké tohle mi říkali i jinde že incrementuju iterátor ale problém je že já nevím pořádně co s tím, ty GameEngine.cpp a pod jen "využívám" ale neměním je takže nevím pořádně co s něma a jak to mám opravit, aby to fungovalo. Nedělám s tím nic velkého a něco co by muselo být úplně bezchybné a podobně, stačí mi když to bude fungovat tak proto se ptám: Co přesně s tím? Takže to nemám inkrementovat?



Princip je takový, že nenecháš for automaticky inkrementovat iterátor, ale děláš to na konci smyčky sám, a to jen v případě, žes z vectoru nemazal. V případě, že jsi erase použil, uložíš do aktálního iterátoru hodnotu, kterou erase vrátil, tu už ale neinkrementuješ. Pokud smazaný prvek byl ve vectoru na posledním místě, erase vrátí vector::end, takže jsi v pohodě.

Zkus to takhle opravit, nebo si vygoogli jak se odebírá z vectoru. Při nejhorším ti sem dám kód.

BTW: Ses díval na tu jeho práci která k tomu byla přidaná jak jsem postoval jako poslední že?


Ano.

Nahlásit jako SPAM
IP: 89.24.135.–
-- ian
Anonymní uživatel
~ Anonymní uživatel
0 příspěvků
19. 12. 2010   #14
-
0
-

To ian :
Místo toho
for (siSprite = m_vSprites.begin(); siSprite != m_vSprites.end(); siSprite++)
{
delete (*siSprite);
m_vSprites.erase(siSprite);
siSprite--;
}

jsem dal:
siSprite = m_vSprites.begin()
while (siSprite !=m_vSprites.end())
{
if ( ??? )
{
delete (*siSprite);
m_vSprites.erase(siSprite);
}
else
{
siSprite++;
}

}

Jenže nevím co dát do toho "if". Dále bych se chtěl zeptat co taky s ifem nad tím:
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;
}

tam bych taky měl dát else ale nevím pořádně jak to použít, omlouvám se ale v tomhle se až tak moc nevyznám, jsem rád že mi to vůbec pojede, je to moje maturitní práce a téma už nejde změnit a ve škole nás boužel nic prakticky nenaučili a takovou chybu jsem opravdu nečekal :)

Nahlásit jako SPAM
IP: 212.71.186.–
ian0
Stálý člen
20. 12. 2010   #15
-
0
-

To Anonymní uživatel : Víceméne zachováš ten původní kód (vč. podmínek), upravíš jen drobnosti, jak jsem psal prve. No, nebude tě trápit, tady je kód toho for cyklu a v příloze patch, abys to nemusel opisovat.

 for (siSprite = m_vSprites.begin(); siSprite != m_vSprites.end(); /*tady neni nic*/ )

{
// 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);
// tohle je dulezite prirazeni
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);

/* inkrement az na konci */
++siSprite;
}

Nahlásit jako SPAM
IP: 89.24.135.–
-- ian
Pepa
~ Anonymní uživatel
84 příspěvků
20. 12. 2010   #16
-
0
-

To ian :
Díky moc, funguje to, ale teď mám problém s tím pod tím, s: "void GameEngine::CleanupSprites()" Snažil jsem se to nějak upravit ale bez účinku (vyplivlo to jinačí chybu), proto píšu znova a opět si s tím nevím rady.
původně:



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.erase(siSprite);
siSprite--;
}
}


Jo a ten GameEngine.cpp, který používám já je "novější" (je tam ještě fce:
// Handle the SA_ADDSPRITE sprite action

if (saSpriteAction & SA_ADDSPRITE)
// Allow the sprite to add its sprite
AddSprite((*siSprite)->AddSprite());

tak jsem to tam přidal)

Zde radši přikládám zdrojáky (je to tam opravené to cos postoval)
http://leteckaposta.cz/152397257

PS: Nevím jak "zacházet" s tím GameEngine.cpp.patch :smile14: (sem to prostě okopíroval a bylo)

Díky za pomoc (a taky vysvětlení)

Nahlásit jako SPAM
IP: 212.71.186.–
ian0
Stálý člen
21. 12. 2010   #17
-
0
-

Ach jo,... ;-D

Pepa napsal:
To ian :
Díky moc, funguje to, ale teď mám problém s tím pod tím, s: "void GameEngine::CleanupSprites()" Snažil jsem se to nějak upravit ale bez účinku (vyplivlo to jinačí chybu), proto píšu znova a opět si s tím nevím rady.
původně:



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.erase(siSprite);
siSprite--;
}
}


Jako učitel jsem asi selhal, kdybys to opravil tak, jak jsem psal, tak to bude fungovat. I když tady je blbost volat erase při každé iteraci, lepší je zavolat delete na každý prvek toho vectoru a pak dát vector::clear:
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();
}


Pak ses ještě přehlíd při tom yank/put (rozuměj copy/paste ;), kód na řádcích 395-398 tam máš dvakrát, tak ho smaž.




Nahlásit jako SPAM
IP: 89.24.135.–
-- ian
Anonymní uživatel
~ Anonymní uživatel
0 příspěvků
21. 12. 2010   #18
-
0
-

To ian : To s tím přehlídnutím, tak to jsem si pak opravil ale už jsem to na tu leteckou poštu dal, ale našel a opravil sem si to takže to v pohodě, měl jsem problém jen s tím CleanUpSprites() ;) Díky moc, jako učitel si neselhal spíš já tady tápu ve tmě ;)

a jinak díky moc, funguje to ;) zachránil jsi mě

Nahlásit jako SPAM
IP: 212.71.186.–
KIIV
~ Moderátor
+43
God of flame
21. 12. 2010   #19
-
0
-

To Anonymní uživatel : to je spis skladani kodu kteremu nerozumis.. spis nez tapani ve tme

chce to proste cas a cvik

Nahlásit jako SPAM
IP: 62.168.56.–
Program vždy dělá to co naprogramujete, ne to co chcete...
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, 8 hostů

Podobná vlákna

Chyba — založil oxidián

Chyba v IF — založil Kolcek

Chyba — založil Sheldon

Chyba — založil posion

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ý