表达式必须是带有枚举的可修改左值
Posted
技术标签:
【中文标题】表达式必须是带有枚举的可修改左值【英文标题】:Expression must be a modifiable lvalue with enums 【发布时间】:2017-07-26 15:33:52 【问题描述】:当我尝试分配枚举值时,我的 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]
这个错误消失了,谁能告诉我为什么会发生这个错误?
很抱歉这个烂摊子,但我不知道如何正确使用这个任务。
【问题讨论】:
与其笨拙的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),并且不是可修改的左值。
【讨论】:
以上是关于表达式必须是带有枚举的可修改左值的主要内容,如果未能解决你的问题,请参考以下文章