2011-07-03 5 views
-1
#include <iostream> 
using namespace std; 

void initializeMap(int mapSizeX, int mapSizeY, int map[][10]) 
{ 
    // Map details: 
    // 0 = # (wall) 
    // 1 = space (free space) 
    // 2 = x (player) 

    for(int x = 0; x < mapSizeX; x++) 
    { 
     map[x][0] = 0; 
    } 

    for(int y = 0; y < (mapSizeY - 2); y++) 
    { 
     map[0][y] = 0; 

     for(int x = 0; x < (mapSizeX - 2); x++) 
     { 
      map[x][y] = 1; 
     } 

     map[mapSizeX][y] = 0; 
    } 

    for(int x = 0; x < mapSizeX; x++) 
    { 
     map[x][mapSizeY - 1] = 0; 
    } 
} 

void paintMap(int mapSizeX, int mapSizeY, int map[][10]) 
{ 
    for(int y = 0; y < mapSizeY; y++) 
    { 
     for(int x = 0; x < mapSizeX; x++) 
     { 
      switch(map[x][y]) 
      { 
       case 0: 
        cout << "#"; 
        break; 

       case 1: 
        cout << " "; 
        break; 

       case 2: 
        cout << "x"; 
        break; 

      } 

      cout << map[x][y]; 
     } 
     cout << endl; 
    } 
} 

int main() 
{ 
    int mapSizeX = 10; 
    int mapSizeY = 10; 
    int map[10][10]; 
    initializeMap(mapSizeX, mapSizeY, map); 
    paintMap(mapSizeX, mapSizeY, map); 

    cout << endl << endl; 

    return 0; 
} 

Mon code se compile parfaitement bien sans erreur mais quand j'essaie de l'exécuter, il dit simplement "Segmentation fault". J'ai fait des recherches et je ne comprends pas pourquoi je l'obtiens parce que je n'utilise pas du tout de pointeurs. Comment puis-je réparer ça? Je le compile en utilisant g ++ et je l'exécute en tapant simplement ./main dans le terminal.Erreur de segmentation

Répondre

4
map[mapSizeX][y] = 0; 

C'est illégal. Les valeurs valides de l'index vont de 0 à mapSizeX - 1.

La ligne devrait être:

map[mapSizeX][y] = 0; 

On suppose que c'est la sortie désirée?

#0#0#0#0#0#0#0#0#0#0 
#0 1 1 1 1 1 1 1 1#0 
#0 1 1 1 1 1 1 1 1#0 
#0 1 1 1 1 1 1 1 1#0 
#0 1 1 1 1 1 1 1 1#0 
#0 1 1 1 1 1 1 1 1#0 
#0 1 1 1 1 1 1 1 1#0 
#0 1 1 1 1 1 1 1 1#0 
#0 1 1 1 1 1 1 1 1#0 
#0#0#0#0#0#0#0#0#0#0 

Si oui, vous avez un certain nombre d'autres hors par une erreur dans votre fonction initializeMap. Au lieu de:

for(int y = 0; y < (mapSizeY - 2); y++) 

et

for(int x = 0; x < (mapSizeX - 2); x++) 

vous devez utiliser

for(int y = 1; y < (mapSizeY - 1); y++) 

et

for(int x = 1; x < (mapSizeX - 1); x++) 

respectivement.


BTW, voici un moyen plus propre à écrire initializeMap:

template<int mapSizeX, int mapSizeY> 
void initializeMap(int (&map)[mapSizeX][mapSizeY]) 
{ 
    for(int y = 0; y < mapSizeY; y++) { 
    for(int x = 0; x < mapSizeX; x++) { 
     if (x == 0 || x + 1 == mapSizeX || y == 0 || y == mapSizeY) 
     map[x][y] = 0; 
     else 
     map[x][y] = 1; 
    } 
    } 
} 

Et vous pouvez l'appeler avec juste

initializeMap(map); 

Pas besoin de passer la taille, le compilateur comprendre out automatiquement.

+0

Merci, ça l'a corrigé! La sortie devrait être comme vous l'avez décrit, mais sans les chiffres qui ont été ajoutés par accident. –

0

Je n'ai pas regardé assez profond pour savoir si c'est le seul problème avec votre code, mais

map[mapSizeX][y] = 0; 

écriront au-dessus des limites du tableau.

0

Dans la deuxième boucle pour de initializeMap -

map[mapSizeX][y] = 0; 

mapSizeX est 10 et il n'y a aucun élément 10*y dans la matrice.