Kirjautuminen

Haku

Tehtävät

Keskustelu: Ohjelmointikysymykset: C: Vika atoi():ssa?

Resiina [23.08.2007 22:21:10]

#

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.

koo [23.08.2007 23:44:07]

#

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.

Resiina [24.08.2007 15:09:04]

#

Joo kappas tämähän ratkaisi ongelman, kun lisäsin tuohon perään vain temp.clear(); . Kiitos, kiitos. :-)

Vastaus

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

Tietoa sivustosta