Olen tässä tehnyt omaa kuvaformaattia kun en muuta koodattavaa ole keksinyt.
SDL_Surface*:een kuva ladataan seuraavalla funktiolla, joka ei suostu toimimaan oikein:
SDL_Surface *REI_Lataa(string tiedosto) { string koodattu; string temp; long w = 0, h = 0; int v = 0; static unsigned char info[1024][768][3] = { { { 0 } } }; for (int i = 0; i < pituus(tiedosto)-2; i++) koodattu += lue(tiedosto, i); // tiedostosta lukeminen toimii aivan oikein, siinä ei pitäisi olla mitään vikaa for (int i = 0; i < koodattu.length(); i++) { switch(koodattu[i]) { case '-': if (!v) w++; break; case '\n': v = 1; h++; break; } } SDL_Surface *palaute = SDL_CreateRGBSurface(SDL_HWSURFACE, w, h, 32, 0, 0, 0, 0); w = 0; h = 0; v = 0; for (int x = 0; x < koodattu.length(); x++) { if (koodattu[x] == '/') { for (int i = x-3; i < x; i++) temp += koodattu[i]; info[w][h][v] = atoi(temp.c_str()); // kun tähän väliin pistää cerr<<temp; niin teksti tulostuu oikein, esim. 255 // mutta jos pistää cerr<<atoi(temp.c_str()); niin tulostuu ihan mitä sattuu, esim. -1673272296 if (v < 2) v++; else v = 0; } if (koodattu[x] == '-') { v = 0; w++; } if (koodattu[x] == '\n') { h++; v = 0; w = 0; } } for (int y = 0; y < palaute->h; y++) for (int x = 0; x < palaute->w; x++) PiirraPikseli(palaute, x, y, info[x][y][0], info[x][y][1], info[x][y][2]); return palaute; }
Kuva, jonka yritän ladata:
255/255/255/-128/128/128/- 000/000/000/-255/000/000/-
Kauttaviiva(/) erottaa värit(rgb), viiva(-) pikselit vaakatasossa ja rivinvaihto(\n) pikselit pystytasossa.
En nyt ihan hirveästi jaksa koodiisi perehtyä, mutta mahtaako tämä ihan pitää paikkansa:
Resiina kirjoitti:
info[w][h][v] = atoi(temp.c_str()); // kun tähän väliin pistää cerr<<temp; niin teksti tulostuu oikein, esim. 255
Tiedoston sisältöähän käydään läpi ja koko ajan temp
:hen vain lisätään tavaraa. Kun lukupötkö on riittävän iso, vastaava kokonaisluku vuotaa yli ja alkaa olla "ihan mitä sattuu". Arvasinko oikein?
Muuten olen sitä mieltä, että tuon tiedoston saisi luettua ja tulkittua yksinkertaisemminkin.
Joo kappas tämähän ratkaisi ongelman, kun lisäsin tuohon perään vain temp.clear(); . Kiitos, kiitos. :-)
Aihe on jo aika vanha, joten et voi enää vastata siihen.