1. ホーム
  2. c++

[解決済み] エラー C3861: 'rollDice': 識別子が見つかりません。

2022-02-14 13:09:59

質問

グラフィックを実装しようとしているのですが、一番下に表示されているint rollDice()という関数がうまく呼び出せません。エラーエラーC3861が発生します。'rollDice': 識別子が見つかりませんでした。

int rollDice();

    void CMFCApplication11Dlg::OnBnClickedButton1()
{ 

   enum Status { CONTINUE, WON, LOST }; 
   int myPoint; 
   Status gameStatus;  
   srand( (unsigned)time( NULL ) ); 
   int sumOfDice = rollDice();

   switch ( sumOfDice ) 
   {
      case 7: 
      case 11:  
        gameStatus = WON;
        break;

      case 2: 
      case 3: 
      case 12:  
        gameStatus = LOST;
        break;
      default: 
            gameStatus = CONTINUE; 
            myPoint = sumOfDice;  
         break;  
   } 
   while ( gameStatus == CONTINUE )
   { 
      rollCounter++;  
      sumOfDice = rollDice(); 

      if ( sumOfDice == myPoint ) 
         gameStatus = WON;
      else
         if ( sumOfDice == 7 ) 
            gameStatus = LOST;
   } 


   if ( gameStatus == WON )
   {  

   }
   else
   {   

   }
} 

int rollDice() 
{
   int die1 = 1 + rand() % 6; 
   int die2 = 1 + rand() % 6; 
   int sum = die1 + die2; 
   return sum;
} 

更新

解決方法は?

コンパイラは、ファイルの最初から最後まで調べます。つまり、関数の定義の配置が重要なのです。この場合、この関数の定義を、最初に使われる前に移動させることができます。

void rollDice()
{
    ...
}

void otherFunction()
{
    // rollDice has been previously defined:
    rollDice();
}

を使用することもできます。 前方宣言 を使って、そのような関数が存在することをコンパイラに知らせます。

// function rollDice with the following prototype exists:
void rollDice();

void otherFunction()
{
    // rollDice has been previously declared:
    rollDice();
}

// definition of rollDice:
void rollDice()
{
    ...
}

また、関数のプロトタイプは 名前 のみならず 戻り値 パラメータ :

void foo();
int foo(int);
int foo(int, int);

このように機能が 区別 . int foo();void foo(); は異なる関数ですが、戻り値のみが異なるため、同じスコープに存在することはできません(詳しくは 関数のオーバーロード ).