2017-05-03 6 views
0

私は以下のコードに問題があります。私はXCoordYCoordの変数を除いてすべて正常に動作しています。 ChangePosition方法では、XCoordに25を追加し、それが50に等しくない場合はXCoordを0にリセットし、とYCoord isnt equal to 50の場合はYCoordに25を追加します。私は、デバッグを通じて見つけた何範囲外になるローカル変数...考えている

ChangePosition方法がXCoordYCoordを返したときにデバッガがswitch声明を通じて継続したときに、彼らは0に戻すということです。私はそれがXCoordYCoord(実際の問​​題かどうか100%確信していない)外出することと関係があると思います。return XCoord, YCoordの構文も合法ですか?私はVisual Studioを使用していますが、それは間違っているとは言われていませんが、わかりません。

変数が変わっていない上記の2つの理由の1つでなければならないと思います。 私はをLoadLevelメソッドの2つの変数で初期化しようとしましたが、ChangePositionメソッドに構造体を渡しましたが、次にLNK2001エラーの原因となる静的int型として変数を宣言する必要があります。 Coords::XCoord += 25を使用して変数を調整しようとしました。しかし、構造体がChangePositionメソッドで宣言されていないため、coords.XCoordを使用することができないため、識別されていない型名(これらの行に沿ったもの)に関するエラーが発生します。

void TileMap::LoadLevel(HINSTANCE hInstance) 
{ 

    LPCSTR szFileName1("..\\Assets\\TILE_01.bmp"); 
    LPCSTR szFileName2("..\\Assets\\Tile_02.bmp"); 
    LPCSTR szFileName3("..\\Assets\\Tile_03.bmp"); 

    Sprite* Tile_01 = new Sprite(); /*Tile_01 is the grass sprite*/ 
    Sprite* Tile_02 = new Sprite(); /*Tile_02 is the wall sprite*/ 
    Sprite* Tile_03 = new Sprite(); /*Tile_03 is the end point sprite*/ 

    int XCoord = 0; 
    int YCoord = 0; 

    const int Columns = 3; 
    const int Rows = 3; 

    char MazeMap[Rows][Columns] = { 
     {1,2,3}, 
     {1,2,3}, 
     {1,2,3} 
    }; 

    for (int x = 0; x < Rows; x++) 
    { 
     for (int y = 0; y < Columns; y++) 
     { 
      switch (MazeMap[x][y]) 
      { 
      case GRASS: /*TILE_01*/ 
       Tile_01->Create(DirectDraw::GetInstance()->GetDDObject(), 25, 25, 0); 
       Tile_01->LoadSprite(hInstance, szFileName1, XCoord, YCoord, 25, 25); 
       Tile_01->Draw(DirectDraw::GetInstance()->GetBackBuffer(), XCoord, YCoord, 25, 25); //Draw Tile 

       ChangePosition(XCoord, YCoord); //Change position 
       break; 

      case WALL: /*TILE_02*/ 
       Tile_02->Create(DirectDraw::GetInstance()->GetDDObject(), 25, 25, 0); 
       Tile_02->LoadSprite(hInstance, szFileName2, XCoord, YCoord, 25, 25); 
       Tile_02->Draw(DirectDraw::GetInstance()->GetBackBuffer(), XCoord, YCoord, 25, 25); //Draw Tile 

       ChangePosition(XCoord, YCoord); //Change position 
       break; 

      case END: /*TILE_03*/ 
       Tile_03->Create(DirectDraw::GetInstance()->GetDDObject(), 25, 25, 0); 
       Tile_03->LoadSprite(hInstance, szFileName3, XCoord, YCoord, 25, 25); 
       Tile_03->Draw(DirectDraw::GetInstance()->GetBackBuffer(), XCoord, YCoord, 25, 25); //Draw Tile 

       ChangePosition (XCoord, YCoord); //Change position 
       break; 
      } 
     } 
    } 

} 

/* 
This method changes the XCoord and YCoord to pass into the sprite draw method 
so the tile is drawn in the correct position 
*/ 
int TileMap::ChangePosition(int XCoord, int YCoord) 
{ 
    if (XCoord != 50) //if (XCoord != screenWidth) //Change position 
    { 
     XCoord += 25; 
    } 
    else if (XCoord == 50 && YCoord != 50) //else if (XCoord == screenWidth && YCoord != screenHeight) 
    { 
     XCoord = 0; 
     YCoord += 25; 
    } 
    return XCoord, YCoord 
} 
+0

1つの 'return'ステートメントで2つのものを返すことはできません。 'return XCoord、YCoord'は有効ですが、カンマ演算子を使用しているので、' return YCoord'と同じです。 – Barmar

+0

複数の値を返すことができたとしても、その関数の結果を何にも割り当てることは決してありません。 – Barmar

答えて

1

デフォルトでは、関数パラメータは値によって渡されます。つまり、関数内でパラメータ変数を代入すると、呼び出し元の変数には影響しません。

関数を変更して、パラメータを参照することができます。次に、代入によって呼び出し元の変数が変更されます。

void TileMap::ChangePosition(int &XCoord, int &YCoord) 
{ 
    if (XCoord != 50) //if (XCoord != screenWidth) //Change position 
    { 
     XCoord += 25; 
    } 
    else if (XCoord == 50 && YCoord != 50) //else if (XCoord == screenWidth && YCoord != screenHeight) 
    { 
     XCoord = 0; 
     YCoord += 25; 
    } 
} 

パラメータを変更するため、この関数から何も返す必要はありません。私はそれをvoid関数に変更しました。

return XCoord, YCoord;は有効な構文ですが、あなたの考えをしません。 How does the Comma Operator work

+0

OPに。 2つのことを返すには、標準ライブラリ ''の 'std :: pair'を使うことを考えてください。もちろん、ここでは必要ありません。 – cppxor2arr

関連する問題