Kirjautuminen

Haku

Tehtävät

Keskustelu: Ohjelmointikysymykset: C++: SDL: Windows ei tykkää SDL_rotozoom.h:sta?

Sivun loppuun

erakko- [07.10.2008 12:57:26]

#

Tälläistä mietin, sillä Linuxilla aloitin tekemään erästä "peliä", jossa keskellä on pallo, jonka kulmaa voidaan muuttaa ja tämä sitten ampuu ympäriltä tulevia palloja.

Nyt kun yritän ajaa ohjelmaa Windowsilla, saan herjan "Sovelluksen alustus epäonnistui (0xc0150002). Lopeta sovellus valitsemalla OK". Sitten kommentoin koodista kaikki SDL_rotozoom.h:n funktiot yms, ja homma toimi mutta tietysti se ei "toimi".

Mikä on syy tälle, ja miten se voidaan korjata tai hoitaa toisella tavalla?

Koodissa ei ole vikaa, se toimii Linuxilla hyvin. Mutta jos joku tuntee sen näkemisen välttämättömäksi, laitan koodin pyynnöstä.

Blaze [07.10.2008 13:08:31]

#

Onhan sulla SDL_gfx.dll jossain?

erakko- [07.10.2008 13:15:23]

#

Blaze kirjoitti:

Onhan sulla SDL_gfx.dll jossain?

On samassa kansiossa, linkerillekkin on annettu se.

Dev-C++ muuten on kääntäjänä.

Metabolix [07.10.2008 14:08:05]

#

Palauta funktioita yksitellen ja tutki, onko jokin tietty asia, joka aiheuttaa virheen.

erakko- [07.10.2008 14:17:25]

#

Metabolix kirjoitti:

Palauta funktioita yksitellen ja tutki, onko jokin tietty asia, joka aiheuttaa virheen.

temp = rotozoomSurface(img,angle,1,1);

Tuon rivin kommentoin ja nyt ohjelma vain välähti. Tästä siis luulisin johtuvan...

temu92 [13.10.2008 02:44:23]

#

Jossain on siis kai muistivuoto. Ainakin itselläni se tekee aina välähdyksen kun käytetään olematonta tietoa.

Metabolix [13.10.2008 08:55:36]

#

temu92 kirjoitti:

Jossain on siis kai muistivuoto.

Taas kerran taitavat mennä termit sekaisin. Muistivuoto tarkoittaa sitä, että muistia varataan muttei käytön jälkeen vapauteta, jolloin muisti "vuotaa" pois käytöstä. Sen sijaan ohjelman kaatumisia aiheuttavat muut väärinkäytökset kuten virheelliset muistiosoitukset. Yleinen virhe on taulukon ylivuoto, joka tarkoittaa siis liian suuren indeksin käyttöä tai liian suuren datamäärän tallentamista (tai lukemista). Tällä ei ole mitään tekemistä muistivuodon kanssa, vaikka nimessä esiintyykin sana vuoto.

Kyse voi kuitenkin olla tästä, mitä temu92 luultavasti tarkoitti, eli virheellisen muistiosoitteen käytöstä. Kannattaa ehkä opetella käyttämään debuggeria, sillä yleensä selviää, missä tällainen virhe on. Myös Dev-C++:n valikosta voi valita vaihtoehdon Debug.

temu92 [13.10.2008 14:08:19]

#

Aina oppii lisää :) Hyvä että ainakin sitte korjasit mun virheelliset sepustukset :D

erakko- [20.10.2008 11:15:11]

#

"An access violation (segmentation fault) raised in your program"

Näin sanoi debuggeri. Mutta eihän se välähdys ole ongelmani, vai onko se sittenkin? Johtuisiko rotozoomSurfacen toimimattomuus jostain muusta syystä?

Metabolix [20.10.2008 12:13:50]

#

Käännetäänpä antamasi virheilmoitus: "Ohjelma käytti virheellistä muistiosoitetta."

Nyt sinun tulisi selvittää, millä osoittimella on väärä arvo ja missä kohti se kuuluisi asettaa. Tarkista ohjelmasta kaikki kohdat, joihin liittyy jokin osoite, siis &-merkki tai osoitinmuuttuja, ja varmista, että jokainen osoitin osoittaa järkevään paikkaan. Esimerkiksi SDL_Surfacen tapauksessa täytyy siis olla varma, että pinta on olemassa.

Toinen hyödyllinen debug-keino on assert-makron käyttö:

#include <assert.h> // Tai <cassert>

int jako(int jaettava, int jakaja) {
    assert(jakaja != 0); // Varmistetaan, ettei jaeta nollalla
    return jaettava / jakaja;
}

Ilman assert-riviä nollalla jakaminen aiheuttaa minulla tällaisen ilmoituksen:

Floating point exception

Sen sijaan assert antaa paljon paremman ilmoituksen:

ohjelma: jakofunktio.cpp:4: int jako(int, int): Assertion `jakaja != 0' failed.

Kannattaa siis ripotella assert-kutsuja ohjelman kriittisiin kohtiin, joissa voi tapahtua virheitä.

erakko- [11.11.2008 12:21:17]

#

Linuxilla huomasin että koodini alussa määritellyt muuttujat aiheuttivat jotain häiriötä (SDL-pintoja globaaleina). Tästä on jo jonkin aikaa, en muista. Ongelma on tosin korjattu enkä tästä eteenpäin tee samanlaista virhettä. Segmentation faulttia tulee silti, assert voisi olla oikea ratkaisu sen tutkimiseen. Mutta muuten Linuxilla SDL_rotozoom.h funktiot toimivat, nykyiset ongelmani ovat sitten muuta asiaa.

Windowsilla en tätä asiaa ole vielä kokeillut, katsotaan sitten...


Sivun alkuun

Vastaus

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

Tietoa sivustosta