【问题标题】:assigning struct in switch not working在开关中分配结构不起作用
【发布时间】:2025-12-04 20:50:01
【问题描述】:

在我的程序中,我试图创建一个新的基于结构的 od switch 语句,但是当我这样做时,编译器会返回一个错误:

Syntax error before '{' token 在具有位置分配的行上

我使用 dev-c++ 4.9.9.2 作为 IDE(我认为它使用 MinGW 作为编译器)。这是为了我兄弟的编程任务,我正在帮助他,几年没见过 C,所以我很生疏(而且我之前也不是冠军)。

这里是简化的代码:

typedef enum{TOP_RIGHT = 0,TOP_LEFT,BOTTOM_RIGHT,BOTTOM_LEFT} diagonal_t;
typedef struct
{
   int row;
   int column;
} position_t;
...
void checkDiagonal(diagonal_t diagonal_to_check)
{
    ...
    position_t position;
    switch(diagonal_to_check)
    {
        case TOP_RIGHT:
             position = {0,0}; //here's the error, but I don't know how to repair it.
                               //how to create a new struct here without disrupting the
                               //switch?
             break;
        case TOP_LEFT:
             position = {0,0};
             break;
        ....
    }
}

【问题讨论】:

  • position = (position_t){0,0}; 在 C99 中

标签: c


【解决方案1】:

var_of_type_struct = { init_value } 语法仅适用于定义;它在作业中不起作用。

常见的三种处理方式是

  1. 定义一个函数来初始化你的struct
  2. 定义一个函数,将字段设置为您传递的参数,并且
  3. 分配struct 的各个字段。

方法一:

void init_pos(position_t *p) {
    p->row = 0;
    p->column = 0;
}
...
case TOP_LEFT:
    init_pos(&position);
    break;

方法二:

void set_pos(position_t *p, int r, int c) {
    p->row = r;
    p->column = c;
}
...
case TOP_LEFT:
    set_pos(&position, 0, 0);
    break;

方法3:

case TOP_LEFT:
    position.row = 0;
    position.column = 0;
    break;

【讨论】:

  • @harper 是的,你是对的!谢谢指正。
【解决方案2】:

你不能这样做:赋值和初始化不是一回事。您正在尝试在赋值中使用初始化语法。您必须手动设置这两个字段:

case TOP_RIGHT:
         position.row = 0;
         position.column = 0;
/* ... */

【讨论】:

    【解决方案3】:

    您需要转换为结构类型,如下所示:

    position = (position_t){0, 0};
    

    【讨论】: