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ä.
Onhan sulla SDL_gfx.dll jossain?
Blaze kirjoitti:
Onhan sulla SDL_gfx.dll jossain?
On samassa kansiossa, linkerillekkin on annettu se.
Dev-C++ muuten on kääntäjänä.
Palauta funktioita yksitellen ja tutki, onko jokin tietty asia, joka aiheuttaa virheen.
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...
Jossain on siis kai muistivuoto. Ainakin itselläni se tekee aina välähdyksen kun käytetään olematonta tietoa.
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.
Aina oppii lisää :) Hyvä että ainakin sitte korjasit mun virheelliset sepustukset :D
"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ä?
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ä.
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...
Aihe on jo aika vanha, joten et voi enää vastata siihen.