0

今天发生了奇怪的事情。出于某种奇怪的原因,我无法使值的除法或乘法起作用,甚至只是在将值写入变量后读出该值也不起作用。这是有问题的代码片段:

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");
}
}

所以,它只是一个简单的比较器,对某个范围的值进行操作。'temp' 在代码中的位置是 temp*0.5 和 temp*2.0,无论哪种情况,它都是巨大且错误的。事实上,即使只是写出 temp 也是错误的,如下面的输出所示。

Wasp
180
177
3
1074266112

Wasp
180
150
30
1077805056

我看不出倒数第二个和最后一个输出不同的原因。这只是为了输出温度,正如前面提到的,乘法和除法也存在同样的问题。

任何有关以下方面的见解:为什么会发生这种情况以及如何解决它,我们将不胜感激。

干杯。

编辑:所以显然有一种奇怪的迂回方法可以让它发挥作用。

int temp = desiredheading-heading;
temp &= 0xFF ;

让它正确返回。虽然我完全不知道为什么会这样,或者是什么导致了原始行为。

4

1 回答 1

3

我真的认为显示的代码和给出的结果之间存在脱节。

UARTprintf("%d\n", temp); --> 1074266112

这恰好是你会得到的,因为你做了这种不匹配的格式和数据类型。
(由于@Daniel Fischer 反馈而应用更正)

UARTprintf("%d\n", 3.0);  --> 1074266112 = 0x40080000
UARTprintf("%d\n", 30.0); --> 1077805056 = 0x403E0000

请仔细检查温度、航向和期望航向的类型。此外,temp 是否真正通过“int temp = desiredheading-heading;”声明和计算?
它真的看起来像 "UARTprintf("%d\n", temp);" 中的 temp 是双。

顺风

于 2013-05-23T18:07:03.850 回答