Stavovy stroj - kde je chyba ? – C / C++ – Fórum – Programujte.com
 x   TIP: Přetáhni ikonu na hlavní panel pro připnutí webu
Reklama
Reklama

Stavovy stroj - kde je chyba ? – C / C++ – Fórum – Programujte.comStavovy stroj - kde je chyba ? – C / C++ – Fórum – Programujte.com

 

Hledá se programátor! Plat 1 800 € + bonusy (firma Boxmol.com)
Taine
~ Anonymní uživatel
11 příspěvků
23. 7. 2008   #1
-
0
-

Ahoj,

zacal jsem programovat stavovy stroj pro hru, ale narazil jsem na problem. Stavovy stroj sestava z vlastniho stavoveho stroje (main.cpp), vychozi tridy herniho stavu (GameState.cpp) a (zatim pouze) jedne tridy reprezentujici hlavni herni stav (MainState.cpp). Kod je zatim velmi kratky, prehledny a srozumitelny, nedela jeste v podstate nic, krome samotne spravy stavu.

Jednotlvie stavy jsou v souboru main.cpp ulozeny pomoci pole ukazatelu na tridu GameState (GameState * states[NUMSTATES]), jednotlive prvky tohoto pole jsou ale inicializovany uz skutecnymi stavy (zatim pouze states[S_MAIN] = new MainState;). Tak by melo (doufam) podle Mistrovstvi v C++ dojit u metod oznacenych jako virtual k pouziti dynamicke vazby a volani metody (napr. states[currstate]->start();) by pak melo zavolat metodu potomka.

Bohuzel program pri spusteni vysle chybu Segmentation fault a ukonci se. K teto chybe dochazi v metode update() v souboru main.cpp. Ruznymi pokusy jsem prisel na to, ze tuto chybu pravdepodobne zpusobuje jakekoliv zavolani metody objektu MainState z pole states (napr. states[currstate]->update();).

Kdyby se nekdo podival na ten kod a zjistil kde je chyba, byl bych vdecny. Predem dekuju Taine

Nahlásit jako SPAM
IP: 217.197.149.–
Reklama
Reklama
Matrix17
~ Anonymní uživatel
285 příspěvků
24. 7. 2008   #2
-
0
-

To Taine : Koukl sem na to (nezkoušel sem to překládat) ale konstanta, kterou sis vytvořil v hlavičkovém souboru main.hpp nebude vidět dál než v tom souboru. A možná bych také být tebou uvažoval o tom, že v hlavním souboru (soubor s funkcí main) bude pouze tato funkce. Všechno ostatní bych přesunul do jiného souboru (ale to je jen rada).
Řešení té konstanty:



enum {NUMSTATES = 1}

Nahlásit jako SPAM
IP: 78.156.128.–
bukaj0
Věrný člen
24. 7. 2008   #3
-
0
-

Matrix17
Neznám standard, ale myslím, že konstanta z hlavičkového souboru jde úplně normálně používat v souborech, které ten hlavičkový includují.

Taine
Když to padá se Segmentation fault, první na co se dívám jsou alokace a uvolňování ;o) Problém je v tom, že v init() vytváříš pouze instanci MainState, ale currstate nastavuješ na S_INTRO. V update() se pak snažíš přistupovat k states[currstate] (což je to samé jako state[S_INTRO]), ale ve states[S_INTRO] nic není. Něco je teprve ve state[S_MAIN]. Proto buď musíš vytvořit něco do states[S_INTRO], nebo v init() nastavit currstate na S_MAIN.

A NUMSTATES by mělo být na počátku nastaveno na počet možných stavů (tedy 4). Pokud ho nastavíš jen na 1, budeš moci vytvářet jenom stav pro S_INTRO. Pokud se pokusíš vytvořit pro S_MAIN, budeš přistupovat za pole a bůhví, co se stane. (Mně se většinou podaří přepsat interní struktury glibcu, s čímž je velká sranda :o))

Nahlásit jako SPAM
IP: 85.70.13.–
Jak se správně ptát? -> http://www.hash.cz/inferno/otazky.html[br][br] Po programování je člověk hladovej.
Taine
~ Anonymní uživatel
11 příspěvků
24. 7. 2008   #4
-
0
-

Matrix17
Diky za postreh, soubor main.cpp rozdelim hned, jakmile me napadne vhodny nazev pro ten novy soubor :)

bukaj
Diky, bylo to opravdu tim. Puvodne jsem mel v planu napsat rovnou i soubor IntroState.cpp, ale pak jsem si to rozmyslel a chtel jsem nejdrive vyzkouset, jestli zatim vse funguje. Zakomentoval jsem radky s IntroState, ale inicializaci currstate uz jsem zapomnel zmenit.

Jinak NUMSTATES ma byt skutecne 2 - S_INTRO a S_MAIN. S_QUIT a S_NOSTATE nejsou skutecne stavy, slouzi jako signal ukonceni programu (S_QUIT), resp. S_NOSTATE signalizuje, ze v tomto pruchodu herni smyckou nema dojit ke zmene stavu.

Taine

Nahlásit jako SPAM
IP: 217.197.149.–
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, 159 hostů

Podobná vlákna

2D hra - stavovy stroj — založil Dusan

Kde je chyba? — založil DooFy93

C# kde je chyba ? — založil Milan

Kde je chyba? — založil Tom@sQo

Kde je chyba? — založil VelkyBubak

Moderátoři diskuze

 

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