表达式必须是带枚举的可修改左值

时间:2017-07-26 15:33:53

标签: c++ arrays enums lvalue

当我尝试分配枚举值时,我在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]这个错误消失了,有人能告诉我为什么会发生这个错误吗?

很抱歉这个烂摊子但是我不知道如何正确使用这个任务。

1 个答案:

答案 0 :(得分:1)

数据成员

tBoard board;
由于typedef

的数组类型为tTile[MAX][MAX]

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](参见上面的typedef)并且不是可修改的左值。