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

Posted

技术标签:

【中文标题】表达式必须是带有枚举的可修改左值【英文标题】: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 ... ; 【参考方案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),并且不是可修改的左值。

【讨论】:

以上是关于表达式必须是带有枚举的可修改左值的主要内容,如果未能解决你的问题,请参考以下文章

C 错误:表达式必须是可修改的左值

为啥我得到的表达式必须是可修改的左值?

指向函数指针的指针 - 表达式必须是可修改的左值

表达式必须是可修改的左值(字符数组)

错误:表达式必须是可修改的左值

C++ 表达式必须是可修改的左值