Kirjautuminen

Haku

Tehtävät

Keskustelu: Ohjelmointikysymykset: C: SDL_Surface ja pixels

Burton [17.02.2010 16:24:05]

#

Moikka!

Olen manipuloinut SDL:n avulla pikseleitä tällaisella menetelmällä:

unsigned int *ptr;
ptr = (unsigned int *)naytto->pixels;
ptr[y * (naytto->pitch >> 2) + x] = 0;

ja mieleeni juolahti eräs kysymys. Pitääkö ptr = (unsigned int *)naytto->pixels -määritys suorittaa aina ennen ptr-taulukon käsittelyä vai voiko ensimmäisen kerran jälkeen muokata ptr:ää miten huvittaa?

Eli

ptr = (unsigned int *)naytto->pixels;
ptr[y * (naytto->pitch >> 2) + x] = 0;
ptr = (unsigned int *)naytto->pixels;
ptr[(y + 1] * (naytto->pitch >> 2) + x] = 0;

vai

ptr = (unsigned int *)naytto->pixels;
ptr[y * (naytto->pitch >> 2) + x] = 0;
ptr[(y + 1] * (naytto->pitch >> 2) + x] = 0;

?

Tein pieniä kokeilua siivittääkseni oppimistani, ja tulin siihen tulokseen, että jos SDL_Surface void *pixels on vain tavallinen taulukko, niin sitä pitäisi pystyä muokkaamaan näin:

char taulu[8] = "jeesus";
char *ptr = taulu;

printf("%s\n", ptr);
ptr[2] = '2';
printf("%s\n", ptr);

jolloin jatkuvaa ptr = taulu -määrittelyä ei pitäisi joutua tekemään. Tämä siis pätee myös pixelsiin? Vai?

En ainakaan huomannut mitään eroa, kun otin esimerkkikoodistani kaikki (ylimääräiset) ptr = (unsigned int *)naytto->pixels; -rivit pois.

Mikä on asian oikea laita?

Metabolix [17.02.2010 18:30:02]

#

Kyllä se on aivan tavallinen taulukko, tai siis osoitin. Eihän se voi muutakaan olla, kun sitä kerran tavallisilla C:n osoitinkikkailuilla käytetään. Ja mihinkä naytto->pixels tuossa välissä muuttuisi?

Koska unsigned int ei välttämättä ole kaikilla koneilla 32-bittinen, koodissasi voi olla vakava bugi. Käytä tällaisessa tilanteessa mieluummin SDL:n omaa Uint32-tyyppiä.

Burton [17.02.2010 21:22:10]

#

Asia ymmärretty. Kiitos selvennyksestä.

Vastaus

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

Tietoa sivustosta