Ohjelmointikieli on siis C++ ja koneessa on Windows XP.
Minulla on siis tällainen funktio, johon olen kommentoinut ne kohdat, jotka voivat kaataa koko ohjelman:
//optimoidaan pinta, jossa ei ole alphaa SDL_Surface *optimoi(SDL_Surface *pinta) { //optimoidaan if (SDL_Surface *opti = SDL_DisplayFormat(pinta)) { SDL_FreeSurface(pinta); //tämä kaataa ohjelman JOSKUS pinta = opti; SDL_FreeSurface(opti); //tämä kaataa ohjelman AINA } else { sprintf(viesti, "%s", SDL_GetError ()); naytavirhe(viesti); } return pinta; SDL_FreeSurface(pinta); //tämä ei kaada ohjelmaa } //kutsutaan funktiota SDL_Surface *kuva2 = optimoi(kuva1);
Joten, miksi nuo rivit kaatavat joskus koko ohjelman? Ilman noita kaikki toimii kuten pitäisi.
Opetteleppas pointterit. http://www.youtube.com/watch?v=i49_SNt4yfk&feature=related
Kiitos vaan hauskasta videosta, vaikka en usko, että siitä oli hirveästi apua tämän korjaamisessa.
Sain siis selvitettyä tuon ja huomasin, että tuo optimoi-funktio vapauttaa sen pinnan, mikä sille annetaan ja olin epähuomiossa yrittänyt vapauttaa samaa pintaa uudelleen tuon funktion ulkopuolella, mikä kaatoi ohjelman. Sitä en kyllä ymmärrä miten tuo kohta, jonka merkitsin kaatamaan ohjelman joskus, aikaisemmin toimi, mutta yhtäkkiä se kaatoikin koko ohjelman.
Mitä SDL_FreeSurface() funktion tulisi sinusta tehdä? Mikä SDL_Surface on tyypiltään? Miksei kyseistä muuttujaa saa käyttää tuon funktion jälkeen? Miksi return sanan jälkeen on kutsu, joka ei siis tee mitään, koska funktion suoritus päättyy juuri tuohon.
Ongelmasi on, että et ymmärrä osoittimia etkä ilmeisesti return-sanaakaan.
printf("Vapautetaan pinta, %p.\n", pinta); SDL_FreeSurface(pinta); pinta = opti; printf("Vapautetaan opti, %p.\n", opti); SDL_FreeSurface(opti); printf("Pinta on nyt %p.\n", pinta); // pinta == opti, tämä juuri vapautettiin! return pinta; // Funktion suoritus päättyy. abort(); // Tänne ei koskaan päästä!
Pinta ja opti viittaavat sijoituksen jälkeen samaan pintaan, joten kun vapautat sen, kumpikaan osoitin ei ole enää kelvollinen. (Älä korjaa toimivaa vaan katso mallia matopelioppaastani. Siinä ovat vapautukset ja returnit kohdillaan.)
Kiitos vielä selventämisestä. Nyt on kaikki taas vähän kirkkaampaa. :)
Taisin vaan pelätä vähän liika, että nuo tasot jäävät muistiin kummittelemaan.
Aihe on jo aika vanha, joten et voi enää vastata siihen.