搜索
bottom↓
回复: 21

实参传递数据错误,无法理解??

[复制链接]

出0入0汤圆

发表于 2012-9-26 09:08:16 | 显示全部楼层 |阅读模式
void window(uchar signal,uchar state_p,uchar state_y,uchar open_time_hour,uchar open_time_minute ,uchar close_time_hour,uchar close_time_minute)
{


if(signal==1)draw_buf(1,0,0,Y_signal);
        else draw_buf(1,0,0,N_signal);

write_variable_buf(15,0,hex_BCD_shi(readtime_buf[5]));
write_variable_buf(22,0,hex_BCD_ge(readtime_buf[5]));
write_buf(29,0, "-");
write_variable_buf(36,0,hex_BCD_shi(readtime_buf[3]));
write_variable_buf(43,0,hex_BCD_ge(readtime_buf[3]));

write_variable_buf(53,0,hex_BCD_shi(readtime_buf[2]));
write_variable_buf(60,0,hex_BCD_ge(readtime_buf[2]));
write_buf(67,0,":");
write_variable_buf(74,0,hex_BCD_shi(readtime_buf[1]));
write_variable_buf(81,0,hex_BCD_ge(readtime_buf[1]));
write_buf(88,0,":");
write_variable_buf(95,0,hex_BCD_shi(readtime_buf[0]));
write_variable_buf(102,0,hex_BCD_ge(readtime_buf[0]));

if(state_p==1)draw_buf(67,1,1,power);
       else draw_buf(67,1,0,power);

write_buf(1,1,"投影仪状态:");
lcd_buf_write(0);
buf_clear();



write_buf(1,0,"继电器状态:");
if(state_y==1)draw_buf(67,0,0,relay_open);
       else draw_buf(67,0,0,relay_close);


if(open_time_hour>23)open_time_hour=23;
if(open_time_minute>59)open_time_minute=59;
if(close_time_hour>23)close_time_hour=23;
if(close_time_minute>59)close_time_minute=59;

//open_time_hour=open_time_hour%100;
//open_time_minute=open_time_minute%100;

write_variable_buf(80,1,open_time_hour/10);//open_time_hour
write_variable_buf(87,1,open_time_hour%10);
write_buf(94,1,"-");
write_variable_buf(101,1,open_time_minute/10);
write_variable_buf(108,1,open_time_minute%10);
write_buf(1,1, "设定开机时间:");

lcd_buf_write(1);
buf_clear();

//test=close_time_hour;
write_variable_buf(80,0,close_time_hour /10);
write_variable_buf(87,0,close_time_hour %10);
write_buf(94,0,"-");
write_variable_buf(101,0,close_time_minute/10);
write_variable_buf(108,0,close_time_minute%10);
write_buf(1,0,"设定关机时间:");

lcd_buf_write(2);
buf_clear();

}


signal,state_p,state_y,这前三个能传到下面,没问题,
close_time_minute这个也没问题
open_time_hour,open_time_minute , close_time_hour,这三个到下面就出错了,
值还是随机的,我用把数据用串口发上来,发现在是数据出错了,
这是为什么?想不明白~~~用是的winAVR,以前没有遇到这种问题。

阿莫论坛20周年了!感谢大家的支持与爱护!!

一只鸟敢站在脆弱的枝条上歇脚,它依仗的不是枝条不会断,而是自己有翅膀,会飞。

出0入0汤圆

 楼主| 发表于 2012-9-26 09:28:48 | 显示全部楼层
不能沉了啊~晚上还得加班啊

出0入0汤圆

 楼主| 发表于 2012-9-26 10:34:03 | 显示全部楼层

出0入0汤圆

发表于 2012-9-26 10:37:04 | 显示全部楼层

出0入0汤圆

 楼主| 发表于 2012-9-26 10:42:54 | 显示全部楼层
苹果老兄,你遇到这种情况不?

出0入0汤圆

发表于 2012-9-26 10:52:20 | 显示全部楼层
好多形参,是不是堆栈不够了

出0入0汤圆

 楼主| 发表于 2012-9-26 11:23:51 | 显示全部楼层
wjkly 发表于 2012-9-26 10:52
好多形参,是不是堆栈不够了

后来我分成两个函数,后面那几个还是传不过去。

出0入0汤圆

发表于 2012-9-26 12:37:05 | 显示全部楼层
tanguicaicai 发表于 2012-9-26 11:23
后来我分成两个函数,后面那几个还是传不过去。

不明白传不过去是什么意思,分两个函数是指函数里调用另一个函数还是两个函数在同一层被调用。如果确定每次都是特定的实参传不过去,看看那些实参是不是外部的,有没有extern声明。 或者你把那些参数设成全局变量测试一下,看看变量值是否正常。

出0入0汤圆

发表于 2012-9-26 12:46:09 | 显示全部楼层
定义的变量类型是否一致

出0入4汤圆

发表于 2012-9-26 12:49:02 | 显示全部楼层
有地方用了指针指出界了吗?

出0入0汤圆

 楼主| 发表于 2012-9-26 12:50:24 | 显示全部楼层
wjkly 发表于 2012-9-26 12:37
不明白传不过去是什么意思,分两个函数是指函数里调用另一个函数还是两个函数在同一层被调用。如果确定每 ...

window(0,0,0,12,30 ,14,30)
也就是本来就
open_time_hour=12
open_time_minute =30
close_time_hour=14
close_time_minute=30
的后面close_time_minute=30
这个没错
open_time_hour!=12
open_time_minute !=30
close_time_hour!=14

出0入0汤圆

 楼主| 发表于 2012-9-26 12:50:41 | 显示全部楼层
PICTURE 发表于 2012-9-26 12:49
有地方用了指针指出界了吗?

没用到指针

出0入0汤圆

 楼主| 发表于 2012-9-26 12:57:35 | 显示全部楼层
leafzq 发表于 2012-9-26 12:46
定义的变量类型是否一致

是一样的,最后一个传来下面来,数据都是对了
前面三个也是正常可以传递,就是open_time_hour,
open_time_minute , close_time_hour,不对,编译通过

出0入0汤圆

发表于 2012-9-26 13:43:24 | 显示全部楼层
你用Debug仿真,从调用window()前,开始单步执行,同时观察open_time_minute , close_time_hour三个变量值,变化情况。

出0入0汤圆

 楼主| 发表于 2012-9-26 13:45:02 | 显示全部楼层
leafzq 发表于 2012-9-26 13:43
你用Debug仿真,从调用window()前,开始单步执行,同时观察open_time_minute , close_time_hour三个变量值 ...

好的~~可咱从来没用过仿真。试试看

出0入0汤圆

发表于 2012-9-26 13:46:20 | 显示全部楼层
tanguicaicai 发表于 2012-9-26 12:50
window(0,0,0,12,30 ,14,30)
也就是本来就
open_time_hour=12

还是没明白 写个简单的函数示意一下,把函数体略掉

出0入0汤圆

发表于 2012-9-26 14:09:17 | 显示全部楼层
是的,也可以直接将整个函数体暂时屏蔽掉,一进函数,就看有问题的变量值,用排除法,找到引起变量异变的原因所在,就行。

出0入0汤圆

 楼主| 发表于 2012-9-26 14:10:27 | 显示全部楼层
leafzq 发表于 2012-9-26 14:09
是的,也可以直接将整个函数体暂时屏蔽掉,一进函数,就看有问题的变量值,用排除法,找到引起变量异变的原 ...

好~~晚上试试下~看看,是什么原因,从来没有过这样的

出0入0汤圆

 楼主| 发表于 2012-9-26 14:19:05 | 显示全部楼层
wjkly 发表于 2012-9-26 10:52
好多形参,是不是堆栈不够了

void window(uchar signal,uchar state_p,uchar state_y,uchar open_time_hour,uchar open_time_minute ,uchar close_time_hour,uchar close_time_minute)
{
write_variable_buf(80,0,close_time_hour /10);
write_variable_buf(87,0,close_time_hour %10);
}也就是说
window(0,0,0,12,30,14,30)
我们不是常这样用的啊,这时,close_time_hour =12传到这个函数时write_variable_buf(80,0,close_time_hour /10);close_time_hour 的值应为12才对,
问题里,一进到这个函数体里close_time_hour 的值就变了不是12,到这个函数时实参就不是12了write_variable_buf(80,0,close_time_hour /10);
window(0,0,0,12,30,14,30)
{
write_variable_buf(80,0,12 /10);//就这意思
write_variable_buf(87,0,12 %10);
}

出0入0汤圆

发表于 2012-9-26 16:22:21 | 显示全部楼层
tanguicaicai 发表于 2012-9-26 14:19
void window(uchar signal,uchar state_p,uchar state_y,uchar open_time_hour,uchar open_time_minute , ...


window(0,0,0,12,30,14,30)
{
   close_time_hour++;
}
其他的部分去掉,close_time_hour是多少呢?

出0入0汤圆

 楼主| 发表于 2012-9-26 16:26:53 | 显示全部楼层
wjkly 发表于 2012-9-26 16:22
window(0,0,0,12,30,14,30)
{
   close_time_hour++;

这个没试过,不过这个值,编译几次都没有变的哦!
还有谢谢这位老兄,的耐心啊~~~

出0入0汤圆

 楼主| 发表于 2012-9-27 08:56:26 | 显示全部楼层
昨晚弄了一晚上,我定义一组数组,并给每一个元素赋值,然后这把这个数组用串口发到PC上来,发现有的对有的错了,再然后,单片机什么下载都没反应了,不跑了,用内部RC也不路了,好像挂了一样的。是不是单片机坏了,我用的是ATMEGA16 PU的,3.3V电压
回帖提示: 反政府言论将被立即封锁ID 在按“提交”前,请自问一下:我这样表达会给举报吗,会给自己惹麻烦吗? 另外:尽量不要使用Mark、顶等没有意义的回复。不得大量使用大字体和彩色字。【本论坛不允许直接上传手机拍摄图片,浪费大家下载带宽和论坛服务器空间,请压缩后(图片小于1兆)才上传。压缩方法可以在微信里面发给自己(不要勾选“原图),然后下载,就能得到压缩后的图片】。另外,手机版只能上传图片,要上传附件需要切换到电脑版(不需要使用电脑,手机上切换到电脑版就行,页面底部)。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

手机版|Archiver|amobbs.com 阿莫电子技术论坛 ( 粤ICP备2022115958号, 版权所有:东莞阿莫电子贸易商行 创办于2004年 (公安交互式论坛备案:44190002001997 ) )

GMT+8, 2024-6-11 01:24

© Since 2004 www.amobbs.com, 原www.ourdev.cn, 原www.ouravr.com

快速回复 返回顶部 返回列表