【问题标题】:Expression must be a modifiable lvalue with enums表达式必须是带有枚举的可修改左值
【发布时间】:2017-07-26 15:33:52
【问题描述】:

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

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

【问题讨论】:

  • 与其笨拙的switch相比,为什么不用std::map的简单查找表呢?
  • @Álvaro Sánchez 看来你的意思是 sokoban.board[j][i]
  • sokoban.board[j, i] 不是您访问二维数组的方式。如果您使用some_name[][] 定义它,您可以使用some_name[][] 访问它。
  • 请提供minimal reproducible example。枚举在哪里声明?
  • 这不是问题,但是在 C++ 中你不需要那种 C 风格的 typedef struct { ... } name; 东西。只需使用struct name { ... };

标签: c++ arrays enums lvalue


【解决方案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),并且不是可修改的左值。

【讨论】:

    猜你喜欢
    • 2020-07-07
    • 2023-03-19
    • 2021-09-17
    • 2014-12-15
    • 2014-12-20
    • 2015-09-19
    • 2016-05-09
    • 2016-09-13
    • 1970-01-01
    相关资源
    最近更新 更多