打印

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

[复制链接]
2750|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、芯片有没有打开看门狗?

使用特权

评论回复
5
yewuyi| | 2011-5-6 14:58 | 只看该作者
这个程序只要在SIM上跑一下就知道错哪里了,根本没必要让别人去找问题。

使用特权

评论回复
6
gaoyiyiyi|  楼主 | 2011-5-6 15:01 | 只看该作者
5楼: 这个程序只要在SIM上跑一下就知道错哪里了,根本没必要让别人去找问题。
-------------------------------------------------------------------------------------------------
SIM是什么DD?求教

使用特权

评论回复
7
lyz6118| | 2011-5-6 15:01 | 只看该作者
uchar i,n;这个uchar,是HEX FF吧;改unsing int 试下哈

使用特权

评论回复
8
Metalor| | 2011-5-6 15:23 | 只看该作者
估计是reset();的问题

使用特权

评论回复
9
gaoyiyiyi|  楼主 | 2011-5-6 15:27 | 只看该作者
大家的意见是,for循环没问题,了解了。我一会查查子函数去。
谢谢各位了

使用特权

评论回复
10
gaoyiyiyi|  楼主 | 2011-5-6 16:21 | 只看该作者
奶奶的,一个子函数都不用,全部写成0和1,结果OK了。。。
哎,我这蛋疼的C语言啊

使用特权

评论回复
11
yangcheng84| | 2011-5-6 21:37 | 只看该作者
请问楼主,最后分析的原因是什么啊,小弟很想知道,谢谢

使用特权

评论回复
12
yuyetufu| | 2011-5-7 08:56 | 只看该作者
看门狗有没有开啊?

使用特权

评论回复
13
hzt818| | 2011-5-7 09:19 | 只看该作者
13楼, 不要胡说

使用特权

评论回复
14
xue| | 2011-5-7 09:27 | 只看该作者
哈哈

使用特权

评论回复
15
dragon0906| | 2011-5-7 09:35 | 只看该作者
uchar n改成signed n

使用特权

评论回复
16
cubasa| | 2011-5-7 09:48 | 只看该作者
本帖最后由 cubasa 于 2011-5-7 09:50 编辑

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

两段代码有点相似,会不会是KEIL给你优化了,出了点小BUG。试试改一下编译选项设置。不行分析汇编吧。
另外,为了防止干扰,前面再加条EA=0;

使用特权

评论回复
17
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个都跑不起来。

使用特权

评论回复
18
刘前辈| | 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

粉丝