Juu eli en tiedä minkä takia tämä tapahtuu, sen takia ajattelinkin kysyä vähän viisaammilta apua (jälleen kerran).
Eli tein funktion jossa voidaan kääntää pelaajan kulmaa painamalle vasemmalle tai oikealle, mutta kun ohjelman käynnistää, niin se kaatuu välittömästi.
Eli koodissa on
class CARS{ public: double x; double y; double nopeus; int kulma; SDL_Surface *lkuva; SDL_Surface *kuva; };
Nytten ohjelma kaatuu
void kaanna_auto(){ if(nappi[SDLK_LEFT]){car.kulma+=2;} if(nappi[SDLK_RIGHT]){car.kulma-=2;} }
Nytten kun toinen komento on poistettu ohjelma toimii loistavasti ja auto kääntyy vasemalle kuten pitääkin.
void kaanna_auto(){ if(nappi[SDLK_LEFT]){car.kulma+=2;} //if(nappi[SDLK_RIGHT]){car.kulma-=2;} }
Edit1: Kun poistin tämän funktion koodista kokonaan, niin ohjelma ei kaadu. Eikös tuonkin funktion pitäisi olla ihan oikein?
void tarkista_vauhti(){ if(car.nopeus > 0){ kaanna_auto(); } }
Outoa on myös, että vaikka funktiota kaanna_auto() ei kutsuttaisi ja mitään funktion komentoa ei ole poistettu, niin ohjelma kaatuu silti.
Todella outoa minusta, mika voisi olla vikana?
EDIT2: Sain koodin toimimaan niin ettei se kaadu, mutta haluan kumminkin tietää vielä minkä takia en voinu kutsua ehdon sisällä kaanna_auto() funktiota?
Tällaisien kummallisten kaatumisien takana on poikkeuksetta muistivuoto.
Edit: Eli sitten vain käymään läpi ohjelmaa, missä on unohdettu varata riittävästi muistia(tai on jäänyt kokonaan varaamatta!).
Muistivirheet ovat siksi ikäviä, että ohjelman toimintaan vaikuttaa, mitä tietoa muistissa on valmiina ja mitä osia muistista ohjelma varaa itselleen.
Esim. seuraava ohjelma, jossa muuttujaa c ei ole alustettu nollaksi, saattaa kuitenkin toimia, jos muistissa on muuttujan kohdalla sattumalta valmiina nolla.
int c; if (c == 0) printf("Toimii!");
Tutki tosiaan ohjelmassasi kaikkia kohtia, joissa käsitellään muistia. Ongelma on luultavasti jossain aivan muualla kuin funktiossa tarkista_vauhti, mutta syystä tai toisesta se ilmenee vasta tämän funktion yhteydessä.
kaivat gdb:n esiin ja debuggaat että mikä oli vikana ;)
Aihe on jo aika vanha, joten et voi enää vastata siihen.