请教一个传参的问题

时间:2022-11-04 21:24:44
pid.kp = mavlink_msg_setpid_get_p(&msg);
pid.ki = mavlink_msg_setpid_get_i(&msg);
pid.kd = mavlink_msg_setpid_get_d(&msg);
savePID(pid.kp, pid.ki, pid.kd);
问题是这样的,kp, ki, kd是float型的,获取的值正常,为什么调试进入savePID后,值就变了,为什么?

12 个解决方案

#1


信息太少,你怎么确定进入 saveid 后值就变了?

#2


你要看看savePID的参数类型是什么,有可能类型默认转换了。
另外你在savePID(pid.kp, pid.ki, pid.kd);这一行设置断点,看看pid.kp,pid,ki,pid.kd这三个值是多少,然后再单步进入savePID看看这三个值是多少。

#3


引用 1 楼 ri_aje 的回复:
信息太少,你怎么确定进入 saveid 后值就变了?

save后,我取出来变了,然后我就用调试工具进去,发现在函数里面值就变了。

#4


引用 2 楼 wangzuxi 的回复:
你要看看savePID的参数类型是什么,有可能类型默认转换了。
另外你在savePID(pid.kp, pid.ki, pid.kd);这一行设置断点,看看pid.kp,pid,ki,pid.kd这三个值是多少,然后再单步进入savePID看看这三个值是多少。

那三个值没有变,因为我一直循环打印那三个值是正常的,可是单步进入savePID后函数里面的参数值就变了。

#5


引用 4 楼 rocshaw 的回复:
Quote: 引用 2 楼 wangzuxi 的回复:

你要看看savePID的参数类型是什么,有可能类型默认转换了。
另外你在savePID(pid.kp, pid.ki, pid.kd);这一行设置断点,看看pid.kp,pid,ki,pid.kd这三个值是多少,然后再单步进入savePID看看这三个值是多少。

那三个值没有变,因为我一直循环打印那三个值是正常的,可是单步进入savePID后函数里面的参数值就变了。

你截图上来看看吧

#6


To set a breakpoint when a variable changes value 

From the Edit menu, click Breakpoints.


Click the Data tab of the Breakpoints dialog box.


In the Expression text box, type the name of the variable.


Click OK to set the breakpoint. 

#7


引用 6 楼 zhao4zhong1 的回复:
To set a breakpoint when a variable changes value 

From the Edit menu, click Breakpoints.


Click the Data tab of the Breakpoints dialog box.


In the Expression text box, type the name of the variable.


Click OK to set the breakpoint. 

这个。。。

#8


以下是VC6在调试时设置变量值改变断点的办法:
To set a breakpoint when a variable changes value 

From the Edit menu, click Breakpoints.
Click the Data tab of the Breakpoints dialog box.
In the Expression text box, type the name of the variable.
Click OK to set the breakpoint. 

VS2010在调试时设置变量值改变断点参考下面:
#include <time.h>
#include <stdlib.h>
#include <windows.h>
int main() {
    int a,b[11];//本来是b[10],为判断哪句越界,故意声明为b[11]

    srand((unsigned int)time(NULL));//按两次F11,等黄色右箭头指向本行时,调试、新建断点、新建数据断点,地址:&b[10],字节计数:4,确定。
    while (1) {//按F5,会停在下面某句,此时a的值为10,b[10]已经被修改为对应0..4之一。
        b[(a=rand()%11)]=0;
        Sleep(100);
        b[(a=rand()%11)]=1;
        Sleep(100);
        b[(a=rand()%11)]=2;
        Sleep(100);
        b[(a=rand()%11)]=3;
        Sleep(100);
        b[(a=rand()%11)]=4;
        Sleep(100);
    }
    return 0;
}

#9


楼上各位大侠,貌似我问的不是调试和vs使用问题。

#10


被强转了吧, 楼主检查一下参数类型是不是匹配。

#11


编译的时候 看看有没有  warning 说了 强转的问题

#12


这个问题 你至少要把 savePID 声明贴出来吧

#1


信息太少,你怎么确定进入 saveid 后值就变了?

#2


你要看看savePID的参数类型是什么,有可能类型默认转换了。
另外你在savePID(pid.kp, pid.ki, pid.kd);这一行设置断点,看看pid.kp,pid,ki,pid.kd这三个值是多少,然后再单步进入savePID看看这三个值是多少。

#3


引用 1 楼 ri_aje 的回复:
信息太少,你怎么确定进入 saveid 后值就变了?

save后,我取出来变了,然后我就用调试工具进去,发现在函数里面值就变了。

#4


引用 2 楼 wangzuxi 的回复:
你要看看savePID的参数类型是什么,有可能类型默认转换了。
另外你在savePID(pid.kp, pid.ki, pid.kd);这一行设置断点,看看pid.kp,pid,ki,pid.kd这三个值是多少,然后再单步进入savePID看看这三个值是多少。

那三个值没有变,因为我一直循环打印那三个值是正常的,可是单步进入savePID后函数里面的参数值就变了。

#5


引用 4 楼 rocshaw 的回复:
Quote: 引用 2 楼 wangzuxi 的回复:

你要看看savePID的参数类型是什么,有可能类型默认转换了。
另外你在savePID(pid.kp, pid.ki, pid.kd);这一行设置断点,看看pid.kp,pid,ki,pid.kd这三个值是多少,然后再单步进入savePID看看这三个值是多少。

那三个值没有变,因为我一直循环打印那三个值是正常的,可是单步进入savePID后函数里面的参数值就变了。

你截图上来看看吧

#6


To set a breakpoint when a variable changes value 

From the Edit menu, click Breakpoints.


Click the Data tab of the Breakpoints dialog box.


In the Expression text box, type the name of the variable.


Click OK to set the breakpoint. 

#7


引用 6 楼 zhao4zhong1 的回复:
To set a breakpoint when a variable changes value 

From the Edit menu, click Breakpoints.


Click the Data tab of the Breakpoints dialog box.


In the Expression text box, type the name of the variable.


Click OK to set the breakpoint. 

这个。。。

#8


以下是VC6在调试时设置变量值改变断点的办法:
To set a breakpoint when a variable changes value 

From the Edit menu, click Breakpoints.
Click the Data tab of the Breakpoints dialog box.
In the Expression text box, type the name of the variable.
Click OK to set the breakpoint. 

VS2010在调试时设置变量值改变断点参考下面:
#include <time.h>
#include <stdlib.h>
#include <windows.h>
int main() {
    int a,b[11];//本来是b[10],为判断哪句越界,故意声明为b[11]

    srand((unsigned int)time(NULL));//按两次F11,等黄色右箭头指向本行时,调试、新建断点、新建数据断点,地址:&b[10],字节计数:4,确定。
    while (1) {//按F5,会停在下面某句,此时a的值为10,b[10]已经被修改为对应0..4之一。
        b[(a=rand()%11)]=0;
        Sleep(100);
        b[(a=rand()%11)]=1;
        Sleep(100);
        b[(a=rand()%11)]=2;
        Sleep(100);
        b[(a=rand()%11)]=3;
        Sleep(100);
        b[(a=rand()%11)]=4;
        Sleep(100);
    }
    return 0;
}

#9


楼上各位大侠,貌似我问的不是调试和vs使用问题。

#10


被强转了吧, 楼主检查一下参数类型是不是匹配。

#11


编译的时候 看看有没有  warning 说了 强转的问题

#12


这个问题 你至少要把 savePID 声明贴出来吧