使用C&;的意外除法/乘法行为;恒星发射台
今天发生了奇怪的事情。出于某种奇怪的原因,我无法使值的除法或乘法有效,甚至在将值写入变量后读取值也不起作用。下面是有问题的代码片段:使用C&;的意外除法/乘法行为;恒星发射台,c,C,今天发生了奇怪的事情。出于某种奇怪的原因,我无法使值的除法或乘法有效,甚至在将值写入变量后读取值也不起作用。下面是有问题的代码片段: void Turning(heading,desiredheading){ //Boats heading too high if (heading>desiredheading){ if ((heading - desiredheading) <10 ){ g_ulServoPulse[1]=makeAngle(5);
void Turning(heading,desiredheading){
//Boats heading too high
if (heading>desiredheading){
if ((heading - desiredheading) <10 ){
g_ulServoPulse[1]=makeAngle(5);
g_ulServoPulse[2]=makeAngle(5);
}else if((heading - desiredheading) <54 ){
g_ulServoPulse[1]=makeAngle(27);
g_ulServoPulse[2]=makeAngle(27);
}else{
g_ulServoPulse[1]=makeAngle((heading-desiredheading)*0.5);
g_ulServoPulse[2]=makeAngle((heading-desiredheading)*0.5);
}
//Boat is heading too low
}else if(desiredheading > heading){
if ((desiredheading -heading) < 10 ){
g_ulServoPulse[1]=makeAngle(-5);
g_ulServoPulse[2]=makeAngle(-5);
}else if ((desiredheading -heading) < 54 ){
g_ulServoPulse[1]=makeAngle(-27);
g_ulServoPulse[2]=makeAngle(-27);
}else{
g_ulServoPulse[1]=makeAngle((desiredheading-heading)*-0.5);
g_ulServoPulse[2]=makeAngle((desiredheading-heading)*-0.5);}
int temp = desiredheading-heading;
//temp = temp ;
UARTprintf("Wasp\n");
UARTprintf("%d\n", desiredheading);
UARTprintf("%d\n", heading);
UARTprintf("%d\n", (desiredheading-heading));
UARTprintf("%d\n", temp);
//Boat is Just right
}else{
g_ulServoPulse[1]=makeAngle(0);
g_ulServoPulse[2]=makeAngle(0);
UARTprintf("Table\n");
}
}
我看不出第二个和最后一个输出有什么不同。这只是为了输出温度,正如前面提到的,乘法和除法也存在同样的问题
任何关于:为什么会发生这种情况以及如何解决它的见解都将不胜感激
干杯
编辑:
很明显,有一种奇怪的迂回方法可以让它正常工作
int temp = desiredheading-heading;
temp &= 0xFF ;
使其正确返回。虽然我完全不知道为什么会这样,或者是什么导致了最初的行为 我真的认为显示的代码和给出的结果之间存在脱节
UARTprintf("%d\n", temp); --> 1074266112
这恰好是您将得到的结果,即您的格式和数据类型不匹配。(由于@Daniel Fischer反馈而应用的更正) 请仔细检查temp、标题和desiredheading的类型。 此外,temp是否通过“int temp=desiredheading;”真正声明和计算?
“UARTprintf(“%d\n”,temp);”中的temp看起来确实是双精度的
公平风我真的认为显示的代码和给出的结果之间存在脱节
UARTprintf("%d\n", temp); --> 1074266112
这恰好是您将得到的结果,即您的格式和数据类型不匹配。(由于@Daniel Fischer反馈而应用的更正) 请仔细检查temp、标题和desiredheading的类型。 此外,temp是否通过“int temp=desiredheading;”真正声明和计算?
“UARTprintf(“%d\n”,temp);”中的temp看起来确实是双精度的
Fair windsdesiredheading和heading的类型是什么?打印出来的输出是否(准确地)对应于您帖子中的代码段?类型应默认为int。如果
desiredheading
和/或heading
是指针,而不是float
,int
等,这可以解释这种行为…嗨,伙计们,为快速反馈干杯。Desiredheading/Heading是int输入,是的,输出与代码段完全对应。不过我已经找到了一个迂回的解决方案,我将简短地更新主帖子desiredheading和heading的类型是什么?打印出来的输出是否与您帖子中的代码片段(精确地)对应?类型应默认为int。如果desiredheading
和/或heading
是指针,而不是float
,int
,等等,这可以解释这种行为……大家好,为快速反馈干杯。Desiredheading/Heading是int输入,是的,输出与代码段完全对应。不过,我已经找到了一个迂回的解决方案,我将很快更新主要帖子
UARTprintf("%d\n", 3.0); --> 1074266112 = 0x40080000
UARTprintf("%d\n", 30.0); --> 1077805056 = 0x403E0000