【问题标题】:C++ "was not declared in this scope" compile errorC ++“未在此范围内声明”编译错误
【发布时间】:2009-03-23 17:41:42
【问题描述】:

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

有人可以帮我吗?谢谢。

【问题讨论】:

  • 还有谁认为“nonrecursivecountcells”是递归的很有趣?
  • @Greg Rogers:你会怎么称呼它?计数细胞? pfft :)

标签: c++ scope


【解决方案1】:

怎么了:

“nonrecursivecountcells”的定义没有名为grid的参数。您需要将类型和变量名称传递给函数。你只传递了类型。

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

***Also you can't pass arrays as values.


如何解决:

解决此问题的简单方法是将指向数组的指针传递给函数“nonrecursivecountcells”。

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

更好并且类型安全 ->

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

关于范围:

在堆栈上创建的变量在其声明的块终止时超出范围。块是左大括号和匹配右大括号内的任何内容。例如 if() { }、function() { }、while() {}、...

注意我说的是变量而不是数据。例如,您可以在堆上分配内存,即使超出范围,数据仍将保持有效。但是最初指向它的变量仍然会超出范围。

【讨论】:

  • 我发现你遇到了麻烦:stackoverflow.com/questions/423823/… :p
  • ** 和 [x][y] 语法不可互换,您不能将颜色网格[x][y] 转换为颜色 **。
  • 它不像强制转换那么简单,你需要制作一个二级指针数组,其中每个元素指向原始二维数组的每一行的开头,然后将新的数组作为参数。
  • @Greg Rogers:是的,我删除了它。谢谢。
  • 我认为这个答案是合适的:stackoverflow.com/questions/274865/pointer-question-in-c/…。无论如何,如果您原则上可以投射并且它会起作用,我不会评论您的答案。但在这里它不会:)
【解决方案2】:

grid 不是全局的,它是 main 函数的局部。改变这个:

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

到这里:

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

基本上你忘了给第一个参数一个名字,网格会做,因为它匹配你的代码。

【讨论】:

  • 您给出的语法实际上被视为类型:color [][COL_SIZE]。请参阅我的回答以了解如何将类型保留为 color[ROW_SIZE][COL_SIZE]。
  • 这样的问题是你可能会不小心通过这种声明方式传入一个大小为 [3][COL_SIZE] 的值。
【解决方案3】:

nonrecursivecountcells() 的第一个参数没有变量名。您尝试在函数体中将其作为网格引用,因此您可能希望将其称为网格。

【讨论】:

    【解决方案4】:

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

    【讨论】:

    • +1 用于解决范围的含义。但是,我认为您对颜色的看法是错误的。参数缺少名称。 “颜色”是数据类型。
    • @rmeador:是的,您正确地将数组作为不可能的值传递。
    • 是的,我把颜色搞砸了 :) 没有仔细阅读原始代码。我要留下它,因为从我的帖子中删除它会使文本变得毫无意义。
    【解决方案5】:

    grid 不存在于 nonrecursivecountcells 的范围内。

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

    【讨论】:

      【解决方案6】:

      修复函数声明

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

      【讨论】:

        猜你喜欢
        • 2011-10-08
        • 1970-01-01
        • 2013-03-05
        • 2011-01-31
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2021-05-13
        • 2010-12-30
        相关资源
        最近更新 更多