web-dev-qa-db-fra.com

Erreur de compilation C ++ «n'a pas été déclaré dans cette étendue»

Nouveau en C++. Dans le programme suivant que j'écris, j'obtiens cette erreur:

g++ -o Blob blob.cc
blob.cc: In function 'int nonrecursivecountcells(color (*)[7], int, int)':
blob.cc:41: error: 'grid' was not declared in this scope

Voici le code:

#include <iostream>
enum color {BACKGROUND, ABNORMAL, TEMPORARY};
const int ROW_SIZE = 7;
const int COL_SIZE = 7;
int nonrecursivecountcells(color[ROW_SIZE][COL_SIZE], int, int);
using namespace std;


int main() 
{
  color grid[ROW_SIZE][COL_SIZE] =
    {{BACKGROUND, ABNORMAL, BACKGROUND, ABNORMAL, BACKGROUND, BACKGROUND, BACKGROUND},
      {ABNORMAL, ABNORMAL, BACKGROUND, ABNORMAL, BACKGROUND, BACKGROUND, BACKGROUND},
       {BACKGROUND, BACKGROUND, ABNORMAL, ABNORMAL, BACKGROUND, BACKGROUND, ABNORMAL},
        {BACKGROUND, BACKGROUND, BACKGROUND, ABNORMAL, ABNORMAL, ABNORMAL, BACKGROUND},
         {BACKGROUND, BACKGROUND, BACKGROUND, ABNORMAL, BACKGROUND, BACKGROUND, BACKGROUND},
          {BACKGROUND, BACKGROUND, BACKGROUND, BACKGROUND, BACKGROUND, ABNORMAL, BACKGROUND},
           {BACKGROUND, ABNORMAL, ABNORMAL, BACKGROUND, BACKGROUND, BACKGROUND, ABNORMAL}};

   cout << "Enter row number" << endl;
   int row;
   cin >> row;
   cout << "Enter column number" << endl;
   int column;
   cin >> column;

   int number = nonrecursivecountcells(grid, row, column);
   cout << "Number off cells in the blob that contains grid[" << row << "][" << column << "] are: " << number << endl;

   return 0;

}

int nonrecursivecountcells(color[ROW_SIZE][COL_SIZE], int row, int column)
{
  if (row < 0 || row >= ROW_SIZE || column < 0 || column >= COL_SIZE)
  {
    return 0;
  }

  else if (grid[row][column] != ABNORMAL)
  {
    return 0;
  }

  else
  {
    grid[row][column] = TEMPORARY;
    return 1
    + nonrecursivecountcells(grid, row - 1, column - 1) + nonrecursivecountcells(grid, row - 1, column)
    + nonrecursivecountcells(grid, row - 1, column + 1) + nonrecursivecountcells(grid, row, column + 1)
    + nonrecursivecountcells(grid, row + 1, column + 1) + nonrecursivecountcells(grid, row + 1, column)
    + nonrecursivecountcells(grid, row + 1, column - 1) + nonrecursivecountcells(grid, row, column - 1);
  }
}

Est-ce que quelqu'un pourrait m'aider? Merci.

10
Rakka86

Qu'est-ce qui ne va pas:

La définition de "cellules non recursives" n'a pas de paramètre nommé grille. Vous devez passer le type et le nom de variable à la fonction. Vous avez seulement passé le type.

Notez que si vous utilisez la grille de noms pour le paramètre, ce nom n'a rien à voir avec votre déclaration de grille principale (). Vous auriez pu aussi utiliser n'importe quel autre nom.

***Vous ne pouvez pas non plus transmettre des tableaux en tant que valeurs.


Comment réparer:

Le moyen le plus simple de résoudre ce problème est de passer un pointeur vers un tableau vers la fonction "cellules non-récursives".

int nonrecursivecountcells(color[ROW_SIZE][COL_SIZE], int, int);

meilleur et tapez sûr ->

int nonrecursivecountcells(color (&grid)[ROW_SIZE][COL_SIZE], int, int);

À propos de la portée:

Une variable créée sur la pile sort de la portée lorsque le bloc dans lequel elle est déclarée est terminé. Un bloc est n'importe quoi dans une accolade ouvrante et correspondant à la fermeture. Par exemple un if () {}, une fonction () {}, tandis que () {}, ...

Notez que j'ai dit variable et non pas des données. Par exemple, vous pouvez allouer de la mémoire sur le tas et ces données resteront valides même en dehors de la portée. Mais la variable qui la désignait à l'origine serait toujours hors de portée.

14
Brian R. Bondy

la grille n'est pas globale, elle est locale à la fonction principale. Change ça:

int nonrecursivecountcells(color[ROW_SIZE][COL_SIZE], int row, int column)

pour ça:

int nonrecursivecountcells(color grid[ROW_SIZE][COL_SIZE], int row, int column)

Fondamentalement, vous avez oublié de donner un nom à ce premier paramètre, la grille fera l'affaire car elle correspond à votre code.

4
Evan Teran

Le premier argument de nonrecursivecountcells () n'a pas de nom de variable. Vous essayez de le référencer en tant que grille dans le corps de la fonction, vous voudrez donc probablement l'appeler grille.

1
JeffH

Comme le dit le compilateur, grid n'a pas été déclaré dans la portée de votre fonction :) "Portée" signifie essentiellement un ensemble d'accolades. Chaque variable est limitée à la portée dans laquelle elle est déclarée (elle n'est pas accessible en dehors de cette portée). Dans votre cas, vous déclarez la variable grid dans votre fonction main() et essayez de l'utiliser dans nonrecursivecountcells(). Vous semblez cependant le passer comme argument colors, donc je vous suggère de renommer simplement vos utilisations de grid dans nonrecursivecountcells() en colors. Je pense qu'il peut y avoir quelque chose de mal à essayer de passer le tableau de cette façon aussi, donc vous devriez probablement étudier le passage en tant que pointeur (à moins que quelqu'un d'autre ne dise le contraire).

1
rmeador

grille n'est pas présent sur la portée des cellules non recursives.

Soit grid un tableau global, ou passez-le comme paramètre à la fonction.

0
Pablo Santa Cruz

correction de la déclaration de fonction sur

int nonrecursivecountcells(color grid[ROW_SIZE][COL_SIZE], int row, int column)
0
bayda