函数中的一个错误,它接受一个ENUM参数

时间:2016-03-28 09:54:36

标签: c enums

我目前正在开发一款用于学习C编程的C控制台游戏。我有3个.c文件(player.c game.c board.c)和3个.h文件(player.h,game.h,board.h)。 game.h包括board.h和player.h,board.h包括player.h。

在player.h中,我有以下内容。

typedef enum direction
{
  NORTH,
  EAST,
  SOUTH,
  WEST
} Direction;

typedef struct player
{
  Position position;
  Direction direction;
} Player;

void displayDirection(Direction direction);
void init(Player * player,Direction direction);

所以在这个控制台游戏中,我需要在不同的方向(NORTH,WEST,EAST,SOUTH)打印箭头,我已经像这样修改了displayDirection功能。

if(direction==NORTH){
    printf("%s|",DIRECTION_ARROW_OUTPUT_NORTH);
//I already define DIRECTION_ARROW_OUTPUT_NORTH in my .h file.
}
else if(direction==EAST){
    printf("%s|",DIRECTION_ARROW_OUTPUT_EAST);
}
else if(direction==SOUTH){
    printf("%s|",DIRECTION_ARROW_OUTPUT_SOUTH);
}
else if(direction==WEST){
    printf("%s|",DIRECTION_ARROW_OUTPUT_WEST);
}

用于init()函数

player->direction=direction;

在board.c文件中,我有一个调用displayDirection();

的函数
void displayBoard(Cell board[BOARD_HEIGHT][BOARD_WIDTH], Player * player)
{
   for(row=0;row<BOARD_HEIGHT;row++){

    for(col=0;col<BOARD_WIDTH;col++){
      if(board[row][col]==PLAYER){
            displayDirection(player->direction);

        }}
   printf("\n");
}

最后,在我的game.c文件中。我正在使用scanf从用户读取输入(方向)并显示它。

Player player;
Direction d;
scanf("%u",&d);
init(&player,d);
displayBoard(board,&player);

我测试了它,但是每次我进入方向(例如WEST)时,它只给我北方向。我不知道问题出在哪里,我觉得这是我的问题,我搜索过枚举类型在线,仍然无法解决问题。希望有人能帮助我!

1 个答案:

答案 0 :(得分:0)

问题原因
在行scanf("%u",&d);中,您假设enum类型和unsigned int类型是可互换的,但这不是真的。

可能的修复
制作辅助功能以进行方向输入。在这里,您可以将用户输入读作intc string,并可将其映射到enum类型。

Direction getDirection(void) {
  int d = 0;
  static const Direction mapping[] = {NORTH, EAST, SOUTH, WEST};
  do {
    if(0 != d) fprintf(stderr, "%s\n", "***ERROR*** Bad input, ignored");
    printf("Enter direction 0:N, 1:E, 2:S, 3:W\n");
    scanf("%d", &d);
  } while(d < 0 || d > 3);
  return mapping[d];
}

后来:

Direction d = getDirection();