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
Fórum › C / C++
Stavovy stroj - kde je chyba ?
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}
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))
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
Přidej příspěvek
Ano, opravdu chci reagovat → zobrazí formulář pro přidání příspěvku
×Vložení zdrojáku
×Vložení obrázku
×Vložení videa
Uživatelé prohlížející si toto vlákno
Podobná vlákna
2D hra - stavovy stroj — založil Dusan
Kde je chyba ? — založil sipeer
Kde ej chyba — založil Tom@sQo
Kde je chyba — založil Milan
Kde ej chyba? — založil Tom@sQo
Moderátoři diskuze