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; } }
Sitä, että välillä 0:sta 640:een on 641 pikseliä. For-silmukoista siis <=-merkki <-merkiksi.
Olipa noloa, kiitos :)
EDIT: Voisikos joku selittää minulle tuon PikselinPiirto funktion toiminta periaatteen kun en ihan sitä tajunnut
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ä.
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.
Aihe on jo aika vanha, joten et voi enää vastata siihen.