IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

C++ Discussion :

Porbleme d'appel de procedure


Sujet :

C++

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé
    Profil pro
    Inscrit en
    Septembre 2007
    Messages
    81
    Détails du profil
    Informations personnelles :
    Localisation : Canada

    Informations forums :
    Inscription : Septembre 2007
    Messages : 81
    Par défaut Porbleme d'appel de procedure
    Bonjour, dans le bout de code suivant je tente d'appeler une procédure qui va compter le nombre de voisins d'une cellule dans un tableau. Je sais que mon programme plante lorsque je l'appele dans Tableau :: nouvelleGeneration...

    Est-ce que quelqu'un peut m'expliquer pourquoi??

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    int Tableau :: nombresVoisins(int i, int j, bool tab[24][80])
        {
            int nbVoisins = 0;
            if (grille[i-1][j-1] == true)
            {
                nbVoisins ++;
            }
            if (grille[i-1][j] == true)
            {
                nbVoisins ++;
            }
            if (grille[i-1][ j+1] == true)
            {
                nbVoisins ++;
            }
            if (grille[i][j-1] == true)
            {
                nbVoisins ++;
            }
            if (grille[i ][j+1] == true)
            {
                nbVoisins ++;
            }
            if (grille[i+1 ][j-1] == true)
            {
                nbVoisins ++;
            }
            if (grille[i+1][j] == true)
            {
                nbVoisins ++;
            }
            if (grille[i+1][j+1] == true)
            {
                nbVoisins ++;
            }
     
            return nbVoisins;
        }
     
     
       void Tableau :: nouvelleGeneration()
       {
            bool grilleTemp[24][80];
     
            //La copie fonctionne
            //Copier la grille dans un tableau temporaire
            for(int i = 0 ; i < 24 ; i++)
            {   for(int j = 0 ; j < 80 ; j++)
                {
                    grilleTemp[i][j] = grille[i][j];
                }
            }
     
            for(int i = 0 ; i < 24 ; i++)
            {   for(int j = 0 ; j < 80 ; j++)
                {
                    //Si une cellule est invisible et elle est entourée de trois cellules
                    //elle devient visible.
                    if(grilleTemp[i][j] == false && nombresVoisins(i,j,grilleTemp) == 3)
                    {
                        grille[i][j] = true;
                    }
     
                    //Si une cellule vivante n'est pas entouré de deux
                    //ou trois cellules elle devient invisible
                    if(grilleTemp[i][j] == true && (!(nombresVoisins(i,j,grilleTemp) == 2) || !(nombresVoisins(i,j,grilleTemp) == 3 )))
                    {
                        grille[i][j] = false;
                    }
     
     
                }
            }

  2. #2
    Membre émérite
    Profil pro
    Inscrit en
    Mars 2005
    Messages
    865
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2005
    Messages : 865
    Par défaut
    Une rapide lecture montrerait que tu as un dépassement de tableau.
    Si pour un quelconque j, grille[0][j] est faux alors tu fais appel à nombresVoisins (0, j, grilleTemp). Or dans la fonction nombresVoisins, tu fais des i-1, donc tu cherches à accèder à un moment ou à un autre à grille[-1][j], ce qui ne va pas.
    Protège tes indices de tableau.

    Ta fonction nombreVoisins pourrait gagner en nombre de lignes sans que ça ne nuise à la lisibilité.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
     
    // Si je reprends ton code, tab n'est jamais utilisé dans cette méthode.
    int Tableau :: nombresVoisins(int i, int j, bool tab[24][80]) {
      int nbVoisins = 0;
      // Pour chaque case voisine,
      for (int ii = i - 1 ; ii <= i + 1 ; ii++) { // en ligne,
        for (int jj = j - 1 ; jj <= j + 1 ; jj++) { // en colonne,
          // si je ne sors pas de la grille,
          if (ii >= 0 && ii < 24 && jj >= 0 && jj < 80) {
    	if (ii != i && jj != j) { // et si je ne suis pas sur la case centrale,
    	  if (grille[ii][jj] == true) nbVoisins ++; // alors j'ai un voisin.
    	}
          }
        }
      }
      return nbVoisins;
    }
    Evite les constantes en dure du style 24 ou 80. Définis de vrais constantes dans ton code (ce que je n'ai pas fait là), ce qui te permettra de plus facilement les changer par la suite.

  3. #3
    Membre confirmé
    Profil pro
    Inscrit en
    Septembre 2007
    Messages
    81
    Détails du profil
    Informations personnelles :
    Localisation : Canada

    Informations forums :
    Inscription : Septembre 2007
    Messages : 81
    Par défaut
    Je te remercie beaucoup, j'avais oublié qu'il fallait que je règle ces cas.

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Appels de procedures stockées dans une proc stockée ?
    Par Nadaa dans le forum MS SQL Server
    Réponses: 12
    Dernier message: 17/07/2008, 10h32
  2. [langage]& dans appel de procedure
    Par Batou dans le forum Langage
    Réponses: 15
    Dernier message: 30/06/2005, 09h20
  3. appeler une procedure d'un sous formulaire
    Par kchrel dans le forum Access
    Réponses: 11
    Dernier message: 19/10/2004, 17h42
  4. Réponses: 3
    Dernier message: 21/09/2004, 07h35
  5. Réponses: 1
    Dernier message: 04/06/2003, 11h48

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo