Question

Je suis assez nouveau programmeur, mais je considère mon google-fu tout à fait compétent et j'ai passé plusieurs heures à la recherche.

J'ai une simple application de SDL qui lit à partir d'un fichier binaire (2 octets comme un numéro de magie, puis 5 octets par « tuile ») Il affiche ensuite chaque carreau dans la mémoire tampon, les octets décident x, y, id, praticabilité et autres. Il est donc le chargement juste niveau vraiment.

Il fonctionne très bien sur tout ordinateur Windows (Windows Server 2008 testé, 7/64 et 7/32) mais quand je compile sur linux, il affiche des tuiles aléatoires dans des positions aléatoires. Je serais tenté de dire que c'est la lecture de la mauvaise partie dans la RAM, mais j'implimented le nombre magique de sorte qu'il serait retourner une erreur si les 2 premiers octets étaient sortis.

J'aimerais comprendre cela moi-même, mais ça me casser les pieds en enfer maintenant et je ne peux pas progresser beaucoup plus loin avec elle à moins que je peux programmer en mouvement (mes courses ordinateur portable sous Linux). J'utilise G ++ sous linux, mingw32g ++ sur Windows.

bool loadlevel(int level_number)
{
    int length;
    std::string filename;
    filename = "Levels/level";
    filename += level_number+48;
    filename += ".lvl";
    std::ifstream level;
    level.open(filename.c_str(),std::ios::in|std::ios::binary);
    level.seekg(0,std::ios::end);
    length = level.tellg();
    level.seekg(0,std::ios::beg);
    char buffer[length];
    level.read(buffer,length);
    if (buffer[0] == 0x49 && buffer[1] == 0x14)
    {
        char tile_buffer[BYTES_PER_TILE];
        int buffer_place = 1;
        while(buffer_place < length)
        {
            for (int i = 1;i <= BYTES_PER_TILE;i++)
            {
                tile_buffer[i] = buffer[buffer_place+1];
                buffer_place++;
            }
            apply_surface(tile_buffer[1],tile_buffer[2],tiles,screen,&clip[tile_buffer[3]]);
        }
    }
    else
    {
        // File is invalid
        return false;
    }
    level.close();
    return true;
}

Merci à l'avance!

Était-ce utile?

La solution

Votre manipulation du tableau est incorrect.
indexation de tableau en C / C ++ commence à 0.

Vous avez défini « tile_buffer » être un tableau de taille « BYTES_PER_TILE ».
Si BYTES_PER_TILE était 5, votre tableau aurait des éléments tile_buffer [0] à tile_buffer [4].

Dans votre intérieur pour boucle en boucle vous de 1 à 5 donc un dépassement de mémoire tampon se produit.

Je ne sais pas si cela est la cause de votre problème, mais il ne sera certainement pas des questions d'aide.

Autres conseils

Ceci est probablement pas une réponse, mais la gestion du tableau de base 1 et la copie non nécessaire faire mon mal à la tête.

Pourquoi ne pas faire quelque chose dans ce sens?

if ((length >= 2+BYTES_PER_TILE) && (buf[0] == CONST1) && (buf[1] == CONST2)) {
    for (char *tile = &buf[2]; tile < &buf[length-BYTES_PER_TILE]; tile+=BYTES_PER_TILE) {
        apply_surface(tile[0],tile[1],tiles,screen,&clip[tile[2]]);
    }
}
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top