2017-07-26 62 views
0

当我尝试指定一个枚举值时,我在C++中有一个可怕的程序。 当我尝试将WallFree等分配给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

为什么不使用'std :: map'简单的查找表而不是笨重的'switch'? – tadman

+1

@ÁlvaroSánchez看起来你的意思是sokoban.board [j] [i] –

+5

'sokoban.board [j,i]'不是你如何访问一个二维数组。如果你用'some_name [] []'定义它,你可以用'some_name [] []'来访问它。 – NathanOliver

回答

1

数据成员

tBoard board; 

具有阵列型tTile[MAX][MAX]由于typedef的

typedef tTile tBoard[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](参见上面的类型定义)和不修改的左值。

相关问题