web-dev-qa-db-ja.com

C ++「このスコープでは宣言されていません」のコンパイルエラー

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

誰かがここで私を手伝ってくれる?ありがとう。

10
Rakka86

何が問題なのですか:

「nonrecursivecountcells」の定義には、gridという名前のパラメーターはありません。タイプと変数名を関数に渡す必要があります。型だけを渡しました。

パラメータに名前グリッドを使用する場合、その名前はグリッドのmain()宣言とは関係ありません。他の名前を使用することもできます。

***また、配列を値として渡すことはできません。


修正方法:

これを修正する簡単な方法は、配列へのポインタを「nonrecursivecountcells」関数に渡すことです。

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

よりよくタイプセーフ->

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

スコープについて:

スタック上に作成された変数は、それが宣言されているブロックが終了するとスコープ外になります。ブロックとは、開始括弧とmatching括弧の中のものです。たとえば、if(){}、function(){}、while(){}、...

データではなく変数と言ったことに注意してください。たとえば、ヒープにメモリを割り当てることができ、そのデータはスコープ外でも有効のままです。しかし、元々それを指し示していた変数は、まだ範囲外です。

14
Brian R. Bondy

グリッドはグローバルではなく、メイン関数に対してローカルです。これを変える:

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

これに:

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

基本的に、最初のパラメーターに名前を付けるのを忘れていました。グリッドがコードに一致するため、グリッドはそれを行います。

4
Evan Teran

Nonrecursivecountcells()の最初の引数には変数名がありません。関数本体でグリッドとして参照しようとするので、おそらくグリッドと呼びます。

1
JeffH

コンパイラが言うように、gridは関数のスコープで宣言されていません:)「スコープ」は基本的に中括弧のセットを意味します。すべての変数は、その変数が宣言されているスコープに制限されます(そのスコープの外にはアクセスできません)。あなたの場合、main()関数でgrid変数を宣言し、nonrecursivecountcells()でそれを使用しようとしています。引数colorsとして渡しているようですが、nonrecursivecountcells()でのgridの使用をcolorsに名前変更することをお勧めします。そのように配列を渡そうとしても何か問題があるのではないかと思うので、ポインタとして渡すことを検討する必要があります(他の誰かが反対のことを言わない限り)。

1
rmeador

gridは、非再帰的カウントセルのスコープには存在しません。

gridをグローバル配列にするか、関数にパラメーターとして渡します。

0

関数宣言を修正

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