Kirjautuminen

Haku

Tehtävät

Keskustelu: Ohjelmointikysymykset: C++: SDL: SDL_gfx ei toimi

Sivun loppuun

erakko- [01.04.2009 09:17:56]

#

Palaan taas tähän ongelmaan, edellinen aihe ehti mennä jo liian vanhaksi.

Ongelmana on edelleen SDL_gfx:n toimivuus, sillä joka kerta kun teen ohjelman joka käyttää SDL_gfx:n funktioita, ohjelman käynnistyessä tulee heti herja ("Sovelluksen alustus epäonnistui (0xc0150002)."), ja Dev-C++:n debuggeri kertoo "An access violation (segmentation fault) raised in your program". Asensin SDL_gfx:n DevPakin kautta, joten kirjastoissa ei pitäisi olla vikaa. Kun kommentoin kaikki SDL_gfx:n funktiot, ohjelma toimii.

Teen näitä asioita Windows XP:llä, ja Ubuntu Linuxilla, ja jälkimmäisellä tätä koko ongelmaa ei ilmene ollenkaan. Kuitenkin samalla koodilla ohjelman suorittaminen ei sitten onnistu Windowsilla. En yhtään ymmärrä missä voisi olla minkäänsorttista muistin väärinkäyttöä, vai onko Linux niin anteeksiantavainen järjestelmä ettei se tälläistä huomioi?

Tässä on koodi jolla suoritan nyt SDL_rotozoomSurfacea:

void Player::Show(SDL_Surface *screen)
{
    //luodaan tilapäinen pinta ja laitetaan siihen käännetty pelaajan kuva
	SDL_Surface *temp = rotozoomSurface(image, angle, 1, 1);
    //piirretään tilapäinen pinta ruudulle
	Draw(temp, screen, (int)x, (int)y);
    //vapautus
	SDL_FreeSurface(temp);
	temp = NULL;
    //imagen muistia ei vapauteta nyt, koska se vapautetaan myöhemmin
}

Metabolix [02.04.2009 14:45:05]

#

Edellisestä keskustelusta jäi sellainen kuva, ettet ehkä debuggaa ohjelmaasi oikein. Millä tavalla olet nyt havainnut, että se "toimii" ilman rotozoomia? Näkyvätkö kääntämättömät kuvat, onko ohjelma periaatteessa käytettävissä?

viimeksi erakko- kirjoitti:

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

Tämä ainakaan ei kuulosta minusta edes "toimivalta" ohjelmalta.

Kokeilepa vaikka korvata rotozoom-kutsut tällaisella:

SDL_Surface *rotozoomSurface_dbg(SDL_Surface *src, double a, double z, int s) {
	SDL_Surface *r;
	/* debug-viesti: kerrotaan, millä parametreilla kutsuttiin */
	printf("rotozoomSurface_dbg(%p, %f, %f, %d)\n", (void*) src, a, z, s);
	/* luodaan 32-bittinen RGB-pinta ja kopioidaan kuva */
	r = SDL_CreateRGBSurface(0, src->w, src->h, 32, 0xff, 0xff00, 0xff0000, 0);
	SDL_BlitSurface(src, 0, r, 0);
	return r;
}

Jos käytät muita SDL_gfx:n funktioita, tee myös niistä vastaavat versiot. Jos ohjelma ei toimi vieläkään, vika on jossain muualla.

erakko- [06.04.2009 11:42:05]

#

Kiitos! Tuo auttoi. Hyvä että sai vihdoinkin tämän ratkaistua.

Metabolix [06.04.2009 11:42:51]

#

Voisitko vielä tarkentaa, millä tavalla tämä auttoi, jotta joku myöhempi ongelmanentsijä voisi ymmärtää asian?

erakko- [07.04.2009 14:36:24]

#

Ääh, olinpas tyhmä. Ei se tietenkään auttanut. Luulin vain että kun ohjelma käynnistyi oikein niin tämä jotenkin auttoi, mutta sitten huomasin että eihän tämä nyt siis mitään kuvia käännä. Eli nyt ohjelma siis toimii tuon kanssa, mutta missäänhän ei selvästikkään käännetä kuvaa. Ja kun yritetään kutsua ihan rotozoomSurfacea, ei koko ohjelma toimi.

Tälläistä tulostusta sain printfin kautta: "rotozoomSurface_dpg(009F6AC0, 90.000000, 1.000000, 1)", jos siitä kukaan saa mitään erikoista irti.

Metabolix [07.04.2009 16:46:12]

#

Et ilmeisesti oivaltanut tämän debuggausmenetelmän ideaa? Tarkoituksena on siis juurikin todeta (tässä tapauksessa), että ohjelma nyt toimii ja että vika on varmemmin rotozoomSurface-funktiossa eikä omassa koodissasi.

Seuraava kokeiltava asia voisi olla kyseisen funktion kopioiminen SDL_gfx:n lähdekoodista (.c-tiedostoista) suoraan ohjelmaasi.

Gaxx [07.04.2009 17:35:59]

#

Voisit myös kokeilla käyttää ohjelmointiputkan oppaan valmiiksi käännettyä versiota: SDL_gfx.lib. Itselläni se on pelittänyt ongelmitta winXP + Dev-cpp(mingw) yhdistelmällä.

Edit: pistetään nyt vielä ohjelma, jolla voit testata toimintaa. Tämä siis on testattu toimivaksi.

#include <iostream>
#include <cstdlib>
#include <SDL/SDL.h>
#include <SDL/SDL_rotozoom.h>

using namespace std;

int main(int a, char** b) {
	SDL_Init(SDL_INIT_VIDEO);
	SDL_Surface* screen = SDL_SetVideoMode(800, 600, 32, SDL_DOUBLEBUF);

	SDL_Surface* picture = SDL_LoadBMP("pic.bmp");
	if(!picture) {
		cerr << "Tee se pic.bmp!" << endl;
		return EXIT_FAILURE;
	}

	SDL_Surface* rotated = rotozoomSurface(picture, 120, 1, 0);

	SDL_FillRect(screen, NULL, 0);
	SDL_BlitSurface(rotated, NULL, screen, NULL);
	SDL_Flip(screen);
	SDL_Delay(1000);

	SDL_FreeSurface(picture);
	SDL_FreeSurface(rotated);

	SDL_Quit();

	return EXIT_SUCCESS;
}

erakko- [08.04.2009 11:11:23]

#

Ei, ei toiminut. Muistaakseni olen tuota SDL_gfx.lib tiedostoa koittanut, ja kokeilin nyt äskenkin.

Ei toiminut myöskään kun kopioin kyseisen funktion lähdekoodista (jep, .c-tiedostosta).

Itse epäilisin että nyt on jotain vikaa asennuksessa tai siitä miten asensin.

Metabolix [08.04.2009 11:22:40]

#

Eräs aiempi keskustelu, jossa SDL_gfx aiheutti ongelmia, päättyi siihen, että kysyjä asensi ilmeisesti kääntäjän kaikkine kirjastoineen uudestaan. Se lienee ainakin kokeilemisen arvoinen vaihtoehto. (Samalla voi harkita siirtymistä esimerkiksi Code::Blocksin käyttäjäksi, kun Dev-C++ on kuollut jo aika kauan sitten.)

erakko- [08.04.2009 12:59:22]

#

Noniin, nyt alkoi toimia. Yhtenä päivänä olin paininut tämän ongelman kanssa, ja etsiskellyt SDL_gfx:n tiedostoja. Nyt huomasin, että Dev-C++:an juurikansiossa oli jotain ylimääräistä, ja nämä olivat nähtävästi jostain aiemmin hankkimastani SDL_gfx-kansiosta, ja jostain päähäni pälkähti tutkia jo bin-kansiossa olevan SDL_gfx.dll tiedoston kokoa ja tämä toisessa kansiossa olevan SDL_gfx.dll tiedoston kokoa. Ja niiden ero olikin huima, nykyinen oli 13 Kt, ja korvasin tämä 80 Kt tiedostolla. Ja nyt toimii.


Sivun alkuun

Vastaus

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

Tietoa sivustosta