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?
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ä.
Asia ymmärretty. Kiitos selvennyksestä.
Aihe on jo aika vanha, joten et voi enää vastata siihen.