Kirjautuminen

Haku

Tehtävät

Keskustelu: Ohjelmointikysymykset: C: SDL Pikselinpiirto ongelma

Baglair [21.01.2006 21:39:06]

#

Mikä vikana, kun tulee Segmentation fault. Joku pikkuvirhe mitä en ole huomannut?

#include <stdio.h>
#include <stdlib.h>
#include <SDL/SDL.h>

void PiirraPikseli(SDL_Surface *naytto, int x, int y, Uint8 R, Uint8 G, Uint8 B);

int main(int argc, char *argv[])	{
	int x, y;

	if(SDL_Init(SDL_INIT_VIDEO) < 0)	{
		return 0;
	}

	SDL_Surface *naytto;
	naytto = SDL_SetVideoMode(640, 480, 32, SDL_HWSURFACE);

	for(x = 0; x <= 640; ++x)	{
		for(y = 0; y <= 480; ++y)	{
			PiirraPikseli(naytto, x, y, 2, 2, 225);
		}
	}
	SDL_Flip(naytto);

	SDL_Delay(5000);
	SDL_Quit();
	return 0;
}

void PiirraPikseli(SDL_Surface *naytto, int x, int y, Uint8 R, Uint8 G, Uint8 B)	{
	Uint32 color = SDL_MapRGB(naytto->format, R, G, B);
	switch (naytto->format->BytesPerPixel)	{
		case 1: // Assuming 8-bpp
	{
		Uint8 *bufp;
		bufp = (Uint8 *)naytto->pixels + y*naytto->pitch + x;
		*bufp = color;
	}
	break;
	case 2: // Probably 15-bpp or 16-bpp
	{
		Uint16 *bufp;
		bufp = (Uint16 *)naytto->pixels + y*naytto->pitch/2 + x;
		*bufp = color;
	}
	break;
	case 3: // Slow 24-bpp mode, usually not used
	{
		Uint8 *bufp;
		bufp = (Uint8 *)naytto->pixels + y*naytto->pitch + x * 3;
		if(SDL_BYTEORDER == SDL_LIL_ENDIAN)	{
			bufp[0] = color;
			bufp[1] = color >> 8;
			bufp[2] = color >> 16;
	}
		else	{
			bufp[2] = color;
			bufp[1] = color >> 8;
			bufp[0] = color >> 16;
		}
	}
	break;
	case 4: // Probably 32-bpp
		{
			Uint32 *bufp;
			bufp = (Uint32 *)naytto->pixels + y*naytto->pitch/4 + x;
			*bufp = color;
		}
	break;
	}
}

Metabolix [21.01.2006 21:47:48]

#

Sitä, että välillä 0:sta 640:een on 641 pikseliä. For-silmukoista siis <=-merkki <-merkiksi.

Baglair [21.01.2006 21:51:57]

#

Olipa noloa, kiitos :)
EDIT: Voisikos joku selittää minulle tuon PikselinPiirto funktion toiminta periaatteen kun en ihan sitä tajunnut

Blaze [21.01.2006 22:20:06]

#

Siinä kelataan näyttömuistin sisältävää taulukkoa, ja sen sisältö, ja sinne kirjoitettavan väriarvon muoto, riippuu siitä, mikä grafiikkatila on käytössä.

Metabolix [21.01.2006 22:29:26]

#

Siksi kannattaisikin tehdä oma funktio. Tuo on kovin hidas funktio, koska siinä tarkistetaan joka kerta erikseen pinnan bittimäärä ja 32-bittisessä tapauksessa vielä turhaan "luodaan väri" SDL:n omalla funktiolla.

Mutta siis ensin siinä tehdään pinnan formaatin mukaan RGB-arvoista värikoodi, sitten switch-lauseessa on eri bittisyvyyksille erilaiset tavat asettaa pinnalle oikeaan kohtaan tuo väriarvo. Sinulle ilmeisesti riittäisi aivan hyvin viimeinen tapaus eli 32-bittinen.

Jos olisi tarvetta saada muutkin bittisyvyydet käyttöön, kannattaisi ennemmin käyttää funktio-osoitinta ja erillistä funktiota kullekin.

Vastaus

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

Tietoa sivustosta