打印

全局变量 局部变量引发的问题

[复制链接]
楼主: xyp749192072
手机看帖
扫描二维码
随时随地手机跟帖
21
wangkj| | 2010-5-6 14:19 | 只看该作者 回帖奖励 |倒序浏览
老板发话:
肯定是软件问题或者硬件问题,好好查查。
期限半小时。查不出来,开除。

使用特权

评论回复
22
冷漠| | 2010-5-6 14:34 | 只看该作者
本帖最后由 冷漠 于 2010-5-6 18:03 编辑
为什么定义成局部变量我的温度采集正确,定义成全局变量采集不正确,这是我问题的核心。非常感谢!


LZ可能要把问题重新阐述清楚一下:LZ在顶楼说的是:第一种情况:使用全局变量获得结果正确,第二种情况:使用局部变量获得结果剧烈变化,不正确。

可是LZ在11楼说的情况又正相反!使用局部变量正确,使用全局变量不正确???请再确定一下!

顺便做个调查,LZ是B型血型吧。

我刚验证了一下,确实看不出使用全局还是局部有什么差别。唯一的区别就是,局部变量在函数每次被调用时,ret[4]数组都被初始化为0,而全局变量只能在编译阶段被初始化一次!以后每次 read_byte(); 被调用时,ret[4]数组初值都不为0。

要验证这两个差别很简单,把局部变量暂时改写成局部静态变量试一试就知道了:

uchar   read_byte( )
{  static uchar ret[4];   
    uchar i,j;
    uchar mid;
........
}

使用特权

评论回复
23
kzwdf| | 2010-5-6 14:49 | 只看该作者
学习一下

使用特权

评论回复
24
luffy59704331| | 2010-5-6 14:56 | 只看该作者
看来 俺不是牛人啊

使用特权

评论回复
25
897293874| | 2010-5-6 14:59 | 只看该作者
牛人何在?

使用特权

评论回复
26
yuyixuanta| | 2010-5-6 15:34 | 只看该作者
采用全局变量的时候,ret[0] 是上一次的结果,里面是有值的。
采用局部变量的时候,ret[0]被初始化为0。
全局变量和局部变量加起来的结果肯定不一致。

使用特权

评论回复
27
liao_fangxing| | 2010-5-6 15:38 | 只看该作者
代码优化引起的??:o

使用特权

评论回复
28
jiabin1024| | 2010-5-6 16:09 | 只看该作者
楼主将语句uchar ret[4]=【0】; 改为
uchar ret[4];
ret[4]=0;试试看

使用特权

评论回复
29
my1693| | 2010-5-6 16:14 | 只看该作者
围观牛人!

使用特权

评论回复
30
反质子| | 2010-5-6 16:45 | 只看该作者
围观 哈哈

使用特权

评论回复
31
冷漠| | 2010-5-6 17:24 | 只看该作者
本帖最后由 冷漠 于 2010-5-6 17:48 编辑

所以,根据22楼,使用全局变量时,下面的ret[0]+mid 初值并不等于 0+mid !正如26楼所说,ret[0]里面是上一次的结果数值。
......
   for(j=0;j<4;j++)
      (
               mid=back[j] <<i;
                ret[j]=ret[j]+mid;                   
        }
........



知道原因,只要修改第一种情况,在函数中添加一句全局变量赋初值0即可:

uchar read_byte()
{
    uchar i,j;
    uchar mid;


ret[0]=0;  ret[1]=0; ......

    for(i=0;i<8;i++)
     {
            read_bit();
            for(j=0;j<4;j++)
                    {
               mid=back[j] <<i;
                ret[j]=ret[j]+mid;
                  
             }
      
     }
return ret[0];

}



使用特权

评论回复
32
华邦掌门人| | 2010-5-6 17:42 | 只看该作者
远远的围观-----

使用特权

评论回复
33
xyp749192072|  楼主 | 2010-5-6 17:45 | 只看该作者
本人妄想通过牛人一词点亮大家眼球,解决问题,没想到“牛人”没工夫看程序,却对本人乱批一通,故本人结贴,以示**!

使用特权

评论回复
34
xyp749192072|  楼主 | 2010-5-6 17:53 | 只看该作者
LZ可能要把问题重新阐述清楚一下:LZ在顶楼说的是:第一种情况:使用全局变量获得结果正确,第二种情况:使用局部变量获得结果剧烈变化,不正确。

可是LZ在11楼说的情况又正相反!使用局部变量正确,使用全局变量 ...
冷漠 发表于 2010-5-6 14:34

对冷漠表示感谢,你没解决我的问题,但很感谢你的慷慨解答,问题可能出在别的地方,不是局部、全局这里的原因。

使用特权

评论回复
35
AD9851| | 2010-5-6 18:43 | 只看该作者
一般牛人是不会花时间去看你那堆C乱码的……

使用特权

评论回复
36
chenho| | 2010-5-6 19:43 | 只看该作者
忍不住进来看了……

使用特权

评论回复
37
xuyiyi| | 2010-5-6 20:17 | 只看该作者
老许C语言不懂,不敢发言,想看看牛人超人们的答案,提着菜篮子在后面捡菜,跟着学点知识。

现在楼主结贴了,楼主没给出答案,我想说说我对此贴肤浅的看法。

我认为楼主的C语言功底很深厚,深不可测,本贴是楼主出题考考21IC上网友的,老许连几十条C语言都写不全的菜鸟可不敢胡言插嘴发言,我只是感到,楼主一开始出题时已给出答案及提示了,并用 【 】 强调错误的地方!当第二种情况时,楼主在子函数中对局部变量类型用 uchar ret[4]=【0】; 声名,大家知道, uchar ret[4]; 是声名包含4个uchar字型的数组,其内容存储在ret[0], ret[1], ret[2], ret[3] 中,而楼主故意在声名局部变量类型时加了 =【0】; 变成了 uchar ret[4]=【0】; 在声名局部变量类型时,还对ret[4]初始化赋于0值,且这个0值加【 】预以强调,已经给出了提示,局部变量ret[4]已超出了子函数中对局部变量数组ret的地址范围,在没有定义的未知地址上的赋0值操作,破坏了占用该地址的其他变量。故出现采集到的温度数字剧烈变化,且数字不正常现象。

不知老许是否将楼主出的题目给解答出来了? 请楼主指正,谢谢。

使用特权

评论回复
38
Quentin| | 2010-5-6 21:12 | 只看该作者
从来没有看代码看到这样笑喷过~

使用特权

评论回复
39
jerkoh| | 2010-5-6 21:32 | 只看该作者
本帖最后由 jerkoh 于 2010-5-6 21:40 编辑

老许~
uchar ret[4]=【0】;  这里的【】应该是楼主想写的{} 就算不写这对括号
uchar ret[4]={0}; 或者uchar ret[4]=0;  
如果是在keil环境下这可不是给 ret[4] 赋初值0 啊!
而是给ret[0] 赋初值0

其他环境的编译器就不知道了

使用特权

评论回复
40
xyp749192072|  楼主 | 2010-5-6 21:53 | 只看该作者
老许C语言不懂,不敢发言,想看看牛人超人们的答案,提着菜篮子在后面捡菜,跟着学点知识。

现在楼主结贴了,楼主没给出答案,我想说说我对此贴肤浅的看法。

我认为楼主的C语言功底很深厚,深不可测,本贴是楼主出 ...
xuyiyi 发表于 2010-5-6 20:17


老徐写的字数很多,语言也很和缓,但不是问题根源
给答案:
给答案:
给答案:
给答案:
给答案:
因为当定义为全局变量时候,下一次读的时候,read_byte函数里有一个ret[j]=ret[j]+mid;语句,右边的ret[j]里面存的始终是上一次的数值(全局变量),所以当定义成全局变量时候,在read_byte里面需要对ret数组进行清零。

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则