2017-07-26 13 views
0

列挙型の値を代入しようとすると、C++でひどいプログラムがあります。 WallまたはFreeなどをsokoban.board[j,i]に割り当てるとエラーが発生します。式は列挙型の変更可能な左辺値でなければなりません

bool loadLevel(ifstream &stream, tSokoban &sokoban, int level) { 
    bool ok = false; 
    string levelStr, levelFile = " ", prove; 
    int j = 0; 
    levelStr = "Level " + to_string(level); 
    while (levelFile != levelStr && EOF) { 
     getline(stream, levelFile); 
    } 
    if (levelFile == levelStr) { 
     ok = true; 
     getline(stream, prove); 
     sokoban.ncol = prove.size(); 
     while (prove != "Level " + to_string(level + 1)) { 
      for (int i = 0; i < prove.size(); i++) { 
       switch (prove[i]) { 
       case '#': 
        sokoban.board[j, i] = Wall; 
        break; 
       case ' ': 
        sokoban.board[j, i] = Free; 
        break; 
       case '$': 
        sokoban.board[j, i] = Box; 
        break; 
       case '.': 
        sokoban.board[j, i] = GoalFree; 
        break; 
       case '@': 
        sokoban.board[j, i] = Player; 
        break; 
       } 
      } 
      getline(stream, prove); 
      j++; 
     } 
     sokoban.nrows = j - 1; 
    } 
    return ok; 
} 

これらが宣言されているため、問題がどこにあるかを知るのは難しい:

typedef tTile tBoard[MAX][MAX]; 
typedef struct { 
    tBoard board; 
    int nrows; 
    int ncol; 
    int rowPlayer; 
    int colPlayer; 
    int numBoxes; 
    int goalBoxes; 
}tSokoban; 
typedef struct { 
    tSokoban sokoban; 
    int numMoves; 
    string nFileName; 
    int level; 
}tGame; 

そして、私はコードで記述した場合:sokoban.board[j,i]このエラーがdissapeared、このエラーが起こる理由を誰も私を言うことができますか?

この混乱については申し訳ありませんが、このタスクを正しく使用する方法はわかりません。

+0

clunkyな 'switch'の代わりに' std :: map'を使った簡単なルックアップテーブルはありませんか? – tadman

+1

@ÁlvaroSánchezsokoban.board [j] [i] –

+5

'sokoban.board [j、i]'は2次元配列へのアクセス方法ではありません。 'some_name [] []'で定義すると、 'some_name [] []'でアクセスします。 – NathanOliver

答えて

1

データメンバ

tBoard board; 

だからあなたは

のように後置表現を使用する必要があり、二次元配列の要素にアクセスすることにより、typedefを

typedef tTile tBoard[MAX][MAX]; 

に配列型tTile[MAX][MAX]を持っています

sokoban.board[j][i] = Wall; 

ここで、式sokoban.board[j][i]は、左辺値はtTileです。この式

sokoban.board[j, i] = Wall; 

として

はその後角括弧内のカンマ演算子が使用されます。実際には

sokoban.board[i] = Wall; 

発現sokoban.board[i]に相当する一次元アレイ型tTile[MAX](上記のtypedefを参照)を有し、変更左辺値ではありません。

関連する問題