C ++ «не было объявлено в этой области» ошибка компиляции - PullRequest
10 голосов
/ 23 марта 2009

Новое в C ++. В следующей программе я пишу я получаю эту ошибку:

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

Вот код:

#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);
  }
}

Может кто-нибудь помочь мне здесь? Спасибо.

Ответы [ 6 ]

14 голосов
/ 23 марта 2009

Что не так:

Определение "nonrecursivecountcells" не имеет параметра с именем grid. Вам необходимо передать имя переменной типа AND в функцию. Вы только передали тип.

Обратите внимание, что если вы используете сетку имен для параметра, это имя не имеет никакого отношения к объявлению сетки для main (). Вы могли бы использовать и любое другое имя.

*** Также вы не можете передавать массивы как значения.


Как исправить:

Самый простой способ исправить это - передать указатель на массив функции "nonrecursivecountcells".

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

лучше и типа безопаснее ->

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

О сфере применения:

Переменная, созданная в стеке, выходит из области видимости, когда блок, в котором она объявлена, завершается. Блок - это что-либо внутри открывающей и соответствующей закрывающей скобки Например, if () {}, function () {}, while () {}, ...

Заметьте, я сказал переменную, а не данные. Например, вы можете выделить память в куче, и эти данные останутся действительными даже за пределами области действия. Но переменная, которая первоначально указывала на это, все равно вышла бы из области видимости.

4 голосов
/ 23 марта 2009
Сетка

не является глобальной, она локальна для основной функции. Изменить это:

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

к этому:

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

По сути, вы забыли дать этому первому параметру имя, которое будет делать grid, поскольку он соответствует вашему коду.

1 голос
/ 23 марта 2009

Как говорит компилятор, grid не было объявлено в области действия вашей функции :) "Scope" в основном означает набор фигурных скобок. Каждая переменная ограничена областью, в которой она объявлена ​​(к ней нельзя получить доступ за пределами этой области). В вашем случае вы объявляете переменную grid в вашей функции main() и пытаетесь использовать ее в nonrecursivecountcells(). Однако вы, похоже, передаете его как аргумент colors, поэтому я предлагаю вам просто переименовать ваши варианты использования grid в nonrecursivecountcells() в colors. Я думаю, что может быть что-то не так с попыткой передать массив таким образом, поэтому вам, вероятно, следует изучить передачу его в качестве указателя (если кто-то еще не скажет что-то противоположное).

1 голос
/ 23 марта 2009

Первый аргумент функции nonrecursivecountcells () не имеет имени переменной. Вы пытаетесь ссылаться на него как на сетку в теле функции, так что вы, вероятно, хотите назвать его сеткой.

0 голосов
/ 23 марта 2009

исправление объявления функции на

int nonrecursivecountcells(color grid[ROW_SIZE][COL_SIZE], int row, int column)
0 голосов
/ 23 марта 2009

сетка отсутствует в области действия нерекурсивных счетчиков.

Либо сделайте grid глобальным массивом, либо передайте его в качестве параметра функции.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...