tanguicaicai 发表于 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));
write_variable_buf(22,0,hex_BCD_ge(readtime_buf));
write_buf(29,0, "-");
write_variable_buf(36,0,hex_BCD_shi(readtime_buf));
write_variable_buf(43,0,hex_BCD_ge(readtime_buf));

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

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,以前没有遇到这种问题。

tanguicaicai 发表于 2012-9-26 09:28:48

不能沉了啊~晚上还得加班啊

tanguicaicai 发表于 2012-9-26 10:34:03

{:cry:}{:cry:}{:cry:}{:cry:}

LY1208798815 发表于 2012-9-26 10:37:04

{:smile:}{:smile:}{:smile:}

tanguicaicai 发表于 2012-9-26 10:42:54

苹果老兄,你遇到这种情况不?

wjkly 发表于 2012-9-26 10:52:20

好多形参,是不是堆栈不够了

tanguicaicai 发表于 2012-9-26 11:23:51

wjkly 发表于 2012-9-26 10:52 static/image/common/back.gif
好多形参,是不是堆栈不够了

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

wjkly 发表于 2012-9-26 12:37:05

tanguicaicai 发表于 2012-9-26 11:23 static/image/common/back.gif
后来我分成两个函数,后面那几个还是传不过去。

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

leafzq 发表于 2012-9-26 12:46:09

定义的变量类型是否一致

PICTURE 发表于 2012-9-26 12:49:02

有地方用了指针指出界了吗?

tanguicaicai 发表于 2012-9-26 12:50:24

wjkly 发表于 2012-9-26 12:37 static/image/common/back.gif
不明白传不过去是什么意思,分两个函数是指函数里调用另一个函数还是两个函数在同一层被调用。如果确定每 ...

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

tanguicaicai 发表于 2012-9-26 12:50:41

PICTURE 发表于 2012-9-26 12:49 static/image/common/back.gif
有地方用了指针指出界了吗?

没用到指针

tanguicaicai 发表于 2012-9-26 12:57:35

leafzq 发表于 2012-9-26 12:46 static/image/common/back.gif
定义的变量类型是否一致

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

leafzq 发表于 2012-9-26 13:43:24

你用Debug仿真,从调用window()前,开始单步执行,同时观察open_time_minute , close_time_hour三个变量值,变化情况。

tanguicaicai 发表于 2012-9-26 13:45:02

leafzq 发表于 2012-9-26 13:43 static/image/common/back.gif
你用Debug仿真,从调用window()前,开始单步执行,同时观察open_time_minute , close_time_hour三个变量值 ...

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

wjkly 发表于 2012-9-26 13:46:20

tanguicaicai 发表于 2012-9-26 12:50 static/image/common/back.gif
window(0,0,0,12,30 ,14,30)
也就是本来就
open_time_hour=12


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

leafzq 发表于 2012-9-26 14:09:17

是的,也可以直接将整个函数体暂时屏蔽掉,一进函数,就看有问题的变量值,用排除法,找到引起变量异变的原因所在,就行。

tanguicaicai 发表于 2012-9-26 14:10:27

leafzq 发表于 2012-9-26 14:09 static/image/common/back.gif
是的,也可以直接将整个函数体暂时屏蔽掉,一进函数,就看有问题的变量值,用排除法,找到引起变量异变的原 ...

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

tanguicaicai 发表于 2012-9-26 14:19:05

wjkly 发表于 2012-9-26 10:52 static/image/common/back.gif
好多形参,是不是堆栈不够了

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

wjkly 发表于 2012-9-26 16:22:21

tanguicaicai 发表于 2012-9-26 14:19 static/image/common/back.gif
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是多少呢?

tanguicaicai 发表于 2012-9-26 16:26:53

wjkly 发表于 2012-9-26 16:22 static/image/common/back.gif
window(0,0,0,12,30,14,30)
{
   close_time_hour++;


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

tanguicaicai 发表于 2012-9-27 08:56:26

昨晚弄了一晚上,我定义一组数组,并给每一个元素赋值,然后这把这个数组用串口发到PC上来,发现有的对有的错了,再然后,单片机什么下载都没反应了,不跑了,用内部RC也不路了,好像挂了一样的。是不是单片机坏了,我用的是ATMEGA16 PU的,3.3V电压
页: [1]
查看完整版本: 实参传递数据错误,无法理解??