C++编译错误:"在此作用域中未声明"

11

我是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);
  }
}

有人能帮我解决这个问题吗?谢谢。


36
还有谁认为“nonrecursivecountcells”是递归的很有趣? - Greg Rogers
4
@Greg Rogers: 你会怎么称呼它?countcells?哼 :) (翻译:@Greg Rogers:What would you call it? countcells? Pfft :)) - Brian R. Bondy
6个回答

14

问题:

"nonrecursivecountcells"的定义中没有名为grid的参数。你需要将类型和变量名都传递给该函数。你只传递了类型。

请注意,如果您使用名称grid作为参数,则该名称与main()声明的grid无关。您也可以使用任何其他名称。

***另外,不能将数组作为值传递。


如何修复:

修复此问题的简单方法是向函数"nonrecursivecountcells"传递一个指向数组的指针。

int nonrecursivecountcells(color[ROW_SIZE][COL_SIZE], int, int);
更好且类型安全。 ->
int nonrecursivecountcells(color (&grid)[ROW_SIZE][COL_SIZE], int, int);

关于作用域:

在堆栈上创建的变量会在声明它的块终止时超出作用域。块是指在开放和匹配关闭大括号之间的任何内容。例如 if() { },function() { },while() {},...

注意我说的是变量而不是数据。例如,你可以在堆上分配内存,该数据即使在作用域之外仍然保持有效。但最初指向该数据的变量仍将超出作用域。


我发现你遇到了程序员的宠物烦恼:http://stackoverflow.com/questions/423823/whats-your-favorite-programmer-ignorance-pet-peeve/484900#484900 :p - Johannes Schaub - litb
双星号和[x][y]语法不可互换,你不能将color grid[x][y]转换为color **。 - Greg Rogers
这并不像简单的强制类型转换那样简单,你需要创建一个指针的二维数组,其中每个元素都指向原始二维数组每一行的开头,然后将该新数组作为参数传递。 - Greg Rogers
@Greg Rogers:是的,我已经将它移除了。谢谢。 - Brian R. Bondy
我认为这个回答非常合适:https://dev59.com/Q3VC5IYBdhLWcg3wfxQ8#274943。无论如何,如果您原则上可以进行转换并且它可以工作,我不会评论您的答案。但是在这种情况下,它不起作用 :) - Johannes Schaub - litb

4

grid不是全局变量,它只在主函数中使用。请更改以下代码:

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

转换为:

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

基本上你忘记给第一个参数命名,grid会做到这一点,因为它匹配你的代码。

您提供的语法实际上被视为类型:color [][COL_SIZE]。请查看我的答案,了解如何保留类型为color[ROW_SIZE][COL_SIZE]。 - Brian R. Bondy
那样做的问题在于您可能会意外地传递一个大小为[3][COL_SIZE]的值。 - Brian R. Bondy

1
nonrecursivecountcells()的第一个参数没有变量名。您在函数体中尝试将其引用为grid,因此您可能想要将其称为grid。

1

正如编译器所说,grid在您的函数范围内未声明 :) “范围”基本上意味着一组花括号。每个变量都限于其声明的范围内(不能在该范围之外访问)。在您的情况下,您正在main()函数中声明grid变量,并尝试在nonrecursivecountcells()中使用它。但是,您似乎将其作为参数colors传递,因此我建议您只需将nonrecursivecountcells()中对grid的使用重命名为colors。我认为尝试以这种方式传递数组可能存在问题,因此您应该调查将其作为指针传递(除非有人说出了相反的话)。


然而,关于作用域,我认为您是错误的。参数缺少名称。“color”是数据类型。作用域指的是代码中的变量可访问性范围。 - JeffH
@rmeador:是的,你关于无法将数组作为值传递是正确的。 - Brian R. Bondy
是的,我在颜色方面搞砸了 :) 没有仔细阅读原始代码。既然删除它会使文本毫无意义,因此我打算保留它在帖子中。 - rmeador

0
修复函数声明在

上的问题。
int nonrecursivecountcells(color grid[ROW_SIZE][COL_SIZE], int row, int column)

0

grid 在 nonrecursivecountcells 的作用域中不存在。

要么将 grid 设为全局数组,要么将其作为参数传递给函数。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接