将typedef结构的函数参数与其在C中的实例声明进行比较
我正在尝试编写以下函数将typedef结构的函数参数与其在C中的实例声明进行比较,c,struct,typedef,C,Struct,Typedef,我正在尝试编写以下函数 #define CW 0 #define CCW 1 typedef struct { uint8_t dir; uint8_t sr; uint8_t pwml; uint8_t en; uint8_t state; uint8_t runstate; uint8_t endstop_status; } Motor_Params; Motor_Params Motor_M1; Motor_Params Motor_M2; Motor_P
#define CW 0
#define CCW 1
typedef struct
{
uint8_t dir;
uint8_t sr;
uint8_t pwml;
uint8_t en;
uint8_t state;
uint8_t runstate;
uint8_t endstop_status;
} Motor_Params;
Motor_Params Motor_M1;
Motor_Params Motor_M2;
Motor_Params Motor_M3;
Motor_Params Motor_M4;
void Home_Motor(Motor_Params *motor, uint8_t dir)
{
if (dir == CCW)
{
// Start moving motor towards the endstop.
while (motor->endstop_status != 1)
{
if (motor == Motor_M1)
Start_M1_CCW();
else if (motor == Motor_M2)
Start_M2_CCW();
else if (motor == Motor_M3)
Start_M3_CCW();
else if (motor == Motor_M4)
Start_M4_5_CCW();
}
}
}
我试图将Motor_Params*Motor
与其实例声明进行比较,这样我就可以将此fn用于多个电机。当我尝试编译这个时,我得到
error: invalid operands to binary == (have 'Motor_Params *' and 'Motor_Params')
if (motor == Motor_M1)
如何将
Motor\u Params*Motor
与其任何实例声明进行比较?当前您正在比较指针和实际结构。你必须选择其中一个
要比较指针,请向结构中添加&
,以获取它们的指针:
if (motor == &Motor_M1)
Start_M1_CCW();
else if (motor == &Motor_M2)
Start_M2_CCW();
else if (motor == &Motor_M3)
Start_M3_CCW();
else if (motor == &Motor_M4)
Start_M4_5_CCW();
若要比较结构的值,请将*
添加到电机
,以取消引用:
if (*motor == Motor_M1)
Start_M1_CCW();
else if (*motor == Motor_M2)
Start_M2_CCW();
else if (*motor == Motor_M3)
Start_M3_CCW();
else if (*motor == Motor_M4)
Start_M4_5_CCW();
目前,您正在比较指针和实际结构。你必须选择其中一个 要比较指针,请向结构中添加
&
,以获取它们的指针:
if (motor == &Motor_M1)
Start_M1_CCW();
else if (motor == &Motor_M2)
Start_M2_CCW();
else if (motor == &Motor_M3)
Start_M3_CCW();
else if (motor == &Motor_M4)
Start_M4_5_CCW();
若要比较结构的值,请将*
添加到电机
,以取消引用:
if (*motor == Motor_M1)
Start_M1_CCW();
else if (*motor == Motor_M2)
Start_M2_CCW();
else if (*motor == Motor_M3)
Start_M3_CCW();
else if (*motor == Motor_M4)
Start_M4_5_CCW();
类似这样的if语句中的比较
if (motor == Motor_M1)
没有道理。也就是说,motor是motor\u Params*
类型的指针,而motor\u M1
是motor\u Params
类型的对象
如果要比较类型为Motor_Params
的两个对象,则需要根据结构的相等操作的含义比较结构类型的两个对象的数据成员。也就是说,没有为结构定义内置运算符==
请注意,当函数定义依赖于全局变量时,这不是一个好主意。而不是这些声明
Motor_Params Motor_M1;
Motor_Params Motor_M2;
Motor_Params Motor_M3;
Motor_Params Motor_M4;
您可以声明一个数组,例如
Motor_Params Motors[4];
并将此数组作为参数传递给函数。if语句中的比较如下
if (motor == Motor_M1)
没有道理。也就是说,motor是motor\u Params*
类型的指针,而motor\u M1
是motor\u Params
类型的对象
如果要比较类型为Motor_Params
的两个对象,则需要根据结构的相等操作的含义比较结构类型的两个对象的数据成员。也就是说,没有为结构定义内置运算符==
请注意,当函数定义依赖于全局变量时,这不是一个好主意。而不是这些声明
Motor_Params Motor_M1;
Motor_Params Motor_M2;
Motor_Params Motor_M3;
Motor_Params Motor_M4;
您可以声明一个数组,例如
Motor_Params Motors[4];
并将此数组作为参数传递给函数。是
Motor_M1
etc固定的参数集,还是可以在运行时更改它们?否则,如果(Motor==Motor_M3)启动_M3_CCW();否则,如果(电机==电机_M4)启动_M4_5_CCW()
这看起来可以只使用电机参数
中的一个函数指针。另外。。。我希望这段代码不是来自真正的工业控制系统。。。?只是一些学校项目,对吗?@Lundin是的,它们可以在运行时更改。不,它不在任何控制系统中。我只是在测试一些东西,但现在我很好奇为什么你会问这个问题,因为你在这里使用的一些术语,如“结束-停止”,与工业起重机的术语非常相似。它们通常正好有4个电机。Motor_M1
etc是固定的参数集还是可以在运行时更改它们?else如果(Motor==Motor_M3)启动_M3_CCW();否则,如果(电机==电机_M4)启动_M4_5_CCW()
这看起来可以只使用电机参数
中的一个函数指针。另外。。。我希望这段代码不是来自真正的工业控制系统。。。?只是一些学校项目,对吗?@Lundin是的,它们可以在运行时更改。不,它不在任何控制系统中。我只是在测试一些东西,但现在我很好奇为什么你会问这个问题,因为你在这里使用的一些术语,如“结束-停止”,与工业起重机的术语非常相似。他们通常只有4个马达。谢谢。虽然我知道您可能会忘记可以修改全局变量的FN,但如果需要全局变量该怎么办。例如,在我的帖子中提到的typedef结构中,endstop状态被另一个fn更新。谢谢。虽然我知道您可能会忘记可以修改全局变量的FN,但如果需要全局变量该怎么办。例如,在我的帖子中提到的typedef结构中,endstop状态由另一个fn更新。