求教个C语言的问题,关于FOR循环的

[复制链接]
3781|17
 楼主| gaoyiyiyi 发表于 2011-5-6 14:15 | 显示全部楼层 |阅读模式
本帖最后由 gaoyiyiyi 于 2011-5-6 14:47 编辑

下面有2种程序,如果main里面只放程序一,或者只放程序二的话,都可以成功运行。两个放一起的话,按理说应该是先跑程序一,然后跑程序二。但是出问题了,一和二都没有成功运行。(语法是可以通过编译的,但是不能实现所要求的功能)
我猜测是for循环语法的问题,猜想是一的for循环没有跑完,就进入二的循环了。有时间的大虾稍微看一下吧。实在是抓狂了。
void main()
{
uchar i,n;
while(1)
{
   /*第一种程序*/
   for(i=0;i<255;i++)
  {
   for(n=20;n>0;n--)
   {
    send_dat(i);  
    send_dat(0);
    send_dat(0);
   };
   reset();
  };
   /*第二种程序*/
    for(i=0;i<255;i++)
  {
   for(n=20;n>0;n--)
   {
    send_dat(0);
    send_dat(i);
    send_dat(0);
   };
   reset();
   };
}
}
lxc806705 发表于 2011-5-6 14:28 | 显示全部楼层
你将第二个程序的变量i用一个新的变量j替代就应该跑通了,当第一个程序执行完时i已经为254了,第二个程序肯定不跑了,不过按道理放在一起至少麦迪一个程序能出来-
 楼主| gaoyiyiyi 发表于 2011-5-6 14:38 | 显示全部楼层
2楼: 你将第二个程序的变量i用一个新的变量j替代就应该跑通了,当第一个程序执行完时i已经为254了,第二个程序肯定不跑了,不过按道理放在一起至少麦迪一个程序能出来-
-------------------------------------------------------------------------------------
我开始也是这么想的,但是试了下不是这个问题。你看第二个程序里,for(i=0;i<255;i++)这个已经给i重新赋值0了。
yewuyi 发表于 2011-5-6 14:57 | 显示全部楼层
1、reset();是干什么的?
2、你根据什么判断没有运行?
3、芯片有没有打开看门狗?
yewuyi 发表于 2011-5-6 14:58 | 显示全部楼层
这个程序只要在SIM上跑一下就知道错哪里了,根本没必要让别人去找问题。
 楼主| gaoyiyiyi 发表于 2011-5-6 15:01 | 显示全部楼层
5楼: 这个程序只要在SIM上跑一下就知道错哪里了,根本没必要让别人去找问题。
-------------------------------------------------------------------------------------------------
SIM是什么DD?求教
lyz6118 发表于 2011-5-6 15:01 | 显示全部楼层
uchar i,n;这个uchar,是HEX FF吧;改unsing int 试下哈
Metalor 发表于 2011-5-6 15:23 | 显示全部楼层
估计是reset();的问题
 楼主| gaoyiyiyi 发表于 2011-5-6 15:27 | 显示全部楼层
大家的意见是,for循环没问题,了解了。我一会查查子函数去。
谢谢各位了
 楼主| gaoyiyiyi 发表于 2011-5-6 16:21 | 显示全部楼层
奶奶的,一个子函数都不用,全部写成0和1,结果OK了。。。
哎,我这蛋疼的C语言啊
yangcheng84 发表于 2011-5-6 21:37 | 显示全部楼层
请问楼主,最后分析的原因是什么啊,小弟很想知道,谢谢
yuyetufu 发表于 2011-5-7 08:56 | 显示全部楼层
看门狗有没有开啊?
hzt818 发表于 2011-5-7 09:19 | 显示全部楼层
13楼, 不要胡说
xue 发表于 2011-5-7 09:27 | 显示全部楼层
dragon0906 发表于 2011-5-7 09:35 | 显示全部楼层
uchar n改成signed n
cubasa 发表于 2011-5-7 09:48 | 显示全部楼层
本帖最后由 cubasa 于 2011-5-7 09:50 编辑

RESET()注释掉后再运行呢?

两段代码有点相似,会不会是KEIL给你优化了,出了点小BUG。试试改一下编译选项设置。不行分析汇编吧。
另外,为了防止干扰,前面再加条EA=0;
 楼主| gaoyiyiyi 发表于 2011-5-7 10:08 | 显示全部楼层
谢谢大家的热心帮忙。问题我已经解决了。是send_dat(i)这个子函数的问题,这个函数是这样的:
void send_dat(uchar dat)       
{
    uchar d;
    for(d=8;d>0;d--)
    {
        if(dat & 0x80)  DIN_bit_1();
            else        DIN_bit_0();
        dat <<=1;
    }
}
就是一个从高位开始取8位数据的函数。如果取到0,单片机的脚就输出0码,如果取到1,单片机就输出1码。(0码和1码的子函数都是没有问题的)
在主程序里,我直接写成:DIN_bit_1();DIN_bit_0();这样的形式,就没有任何问题。如果使用void send_dat(uchar dat)这个子函数,也没有问题。但是如果把2个大程序都放进MAIN(),结果是1个都跑不起来。
刘前辈 发表于 2011-5-7 10:16 | 显示全部楼层
本帖最后由 刘前辈 于 2011-5-7 10:18 编辑
for(i=0;i<255;i++)
  {
   for(n=20;n>0;n--)
   {
    send_dat(i);  
    send_dat(0);
    send_dat(0);
   };    // ???????????????????????
reset();
};   //???????????????????




for( ; ; )
{   }
语句后面不应该有分号!






!//
您需要登录后才可以回帖 登录 | 注册

本版积分规则

112

主题

792

帖子

2

粉丝
快速回复 在线客服 返回列表 返回顶部