Kirjautuminen

Haku

Tehtävät

Keskustelu: Ohjelmointikysymykset: C++: SDL_FreeSurface kaataa joskus ohjelman

Anaatti [03.01.2010 12:55:56]

#

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.

kayttaja-2499 [03.01.2010 13:13:58]

#

Opetteleppas pointterit. http://www.youtube.com/watch?v=i49_SNt4yfk­&feature=related

Anaatti [03.01.2010 19:20:13]

#

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.

Teuro [03.01.2010 19:28:24]

#

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.

Metabolix [03.01.2010 21:03:15]

#

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.)

Anaatti [03.01.2010 21:26:03]

#

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.

Vastaus

Aihe on jo aika vanha, joten et voi enää vastata siihen.

Tietoa sivustosta