打印

GD32qq群知识整理-5-一个static引发的讨论

[复制链接]
1733|20
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
sunmeat|  楼主 | 2014-10-27 14:19 | 只看该作者 |只看大图 回帖奖励 |倒序浏览 |阅读模式
本帖最后由 sunmeat 于 2014-10-27 14:36 编辑
long b,c;
void flter(void)
{
long a;
static long adcd=0;
b=a;
a= 1000;
adcd=a;
c=adcd;
}
c是确定的,b是不定值。
如果b和c交换,则结果反过来了。
沙发
sunmeat|  楼主 | 2014-10-27 14:20 | 只看该作者
【105】常州-洋派(228650903) 9:51:36
此MCU是STM32F030F4
【103】趴趴熊(177150456) 9:51:40
结果正确。
【105】常州-洋派(228650903) 9:51:51
一样程序在VC是正确的。
【150】MP(183350168) 9:51:55
为什么使用不确定的数?
【150】MP(183350168) 9:52:26
VC是PC上的,你知道windows帮你做了多少活吗
【105】常州-洋派(228650903) 9:52:29
我想确定,结果却不确定
【103】趴趴熊(177150456) 9:52:39
确定个毛

使用特权

评论回复
板凳
sunmeat|  楼主 | 2014-10-27 14:20 | 只看该作者
【103】趴趴熊(177150456) 9:52:44
SRAM的值本来就是随机
【103】趴趴熊(177150456) 9:53:13
b 在栈里头。 只要上电不对整片SRAM清零,栈里就是随机值
【105】常州-洋派(228650903) 9:53:21
每执行一次结果都不一样。
【150】MP(183350168) 9:53:39
不确定才是正常的
【103】趴趴熊(177150456) 9:53:49
没错,就是每执行一次结果都不一样。 所以就是正常的。

使用特权

评论回复
地板
sunmeat|  楼主 | 2014-10-27 14:21 | 只看该作者
【105】常州-洋派(228650903) 9:54:20
不知static是做什么的?
【150】MP(183350168) 9:54:23
从这个例子上看,VC是有问题的
【101】道可道  笨鸟(549040622) 9:54:26
你忘记初始化了
【150】MP(183350168) 9:54:36
因为VC后台帮你把数据初始化了
【103】趴趴熊(177150456) 9:54:44
你的 a 没有 static
【101】道可道  笨鸟(549040622) 9:54:46
如果初始化,肯定就不一样了

使用特权

评论回复
5
sunmeat|  楼主 | 2014-10-27 14:22 | 只看该作者
【150】MP(183350168) 9:55:15
VC你用Release模式,再编译一遍,然后看看结果
【105】常州-洋派(228650903) 9:55:32

long b,c;
void flter(void)
{
long a;
static long adcd=0;
b=adcd;
a= 1000;
adcd=a;
c=adcd;
}
【105】常州-洋派(228650903) 9:56:04
程序整理错了一句
【103】趴趴熊(177150456) 9:56:54
双击查看原图 那整理好了,调出错了,再贴出来
【105】常州-洋派(228650903) 9:57:20
我的结论没错
【103】趴趴熊(177150456) 9:58:01
我不知道要看哪段代码。 好像**蛋里挑骨头
【150】MP(183350168) 9:58:31
你最后还没挑到
【150】MP(183350168) 9:59:03
我不是叫你VC用Release再编译一下,然后看结果吗

使用特权

评论回复
6
sunmeat|  楼主 | 2014-10-27 14:24 | 只看该作者

【105】﹌゜  FantasticGirl° (642175216) 9:59:07
static 跟 全局变量的效果一样.但是是隐藏的.只有该函数才能访问
【105】﹌゜  FantasticGirl° (642175216) 9:59:36
出现什么问题.我来帮你解释解释
【150】MP(183350168) 9:59:41
MDK的startup会初始化所有全局变量
【103】趴趴熊(177150456) 9:59:48
标准C的static,默认初始化为 0
【150】MP(183350168) 9:59:51
用户没初始化,的会清零
【103】趴趴熊(177150456) 9:59:56
自动的
【150】MP(183350168) 10:00:15
但是,用户可以指定,某些变量,不要清零
【150】MP(183350168) 10:00:42

使用特权

评论回复
7
sunmeat|  楼主 | 2014-10-27 14:28 | 只看该作者
【105】﹌゜  FantasticGirl° (642175216) 10:00:49
startup确实可以这么做
【150】MP(183350168) 10:01:09
这个数组,startup就不再帮他清零了

使用特权

评论回复
8
sunmeat|  楼主 | 2014-10-27 14:29 | 只看该作者

使用特权

评论回复
9
sunmeat|  楼主 | 2014-10-27 14:29 | 只看该作者
【105】常州-洋派(228650903) 10:50:45
哪位从语法来看下,问题出在哪里?
【105】常州-洋派(228650903) 10:54:12
flter1里面的Adc的值是稳定的,flter2里面的Adc的值是不确定的。
【105】常州-洋派(228650903) 10:55:03
不定值的大小范围前面贴过
【150】MP(183350168) 11:01:58
有什么问题?
【150】MP(183350168) 11:08:27
abcd这不固定式0吗

使用特权

评论回复
10
sunmeat|  楼主 | 2014-10-27 14:31 | 只看该作者
【150】MP(183350168) 11:08:46
adc也是为0
【101】Owen 上海(947894709) 11:11:56
用的到long吗
【105】﹌゜  FantasticGirl° (642175216) 11:19:53

【105】﹌゜  FantasticGirl° (642175216) 11:19:56
你这个逗比
【105】﹌゜  FantasticGirl° (642175216) 11:20:03
adcd都没初始化
【105】﹌゜  FantasticGirl° (642175216) 11:20:16
adcd是static
【105】﹌゜  FantasticGirl° (642175216) 11:20:30
只有第一次是0

使用特权

评论回复
11
sunmeat|  楼主 | 2014-10-27 14:32 | 只看该作者
【105】﹌゜  FantasticGirl° (642175216) 11:21:10
long a是局部变量.在栈中申请
【105】﹌゜  FantasticGirl° (642175216) 11:22:18
a = 1000.对局部变量赋值。将局部给static 相遇于C++ 里面的引用
【105】﹌゜  FantasticGirl° (642175216) 11:22:56
问题的关键.你要留意adcd的值
【105】﹌゜  FantasticGirl° (642175216) 11:23:09
看退出函数之后.他的地址.他的值是否变化

使用特权

评论回复
12
sunmeat|  楼主 | 2014-10-27 14:33 | 只看该作者
【105】﹌゜  FantasticGirl° (642175216) 11:24:04
你去看看 const & 这些特性..
【105】﹌゜  FantasticGirl° (642175216) 11:24:15
证明你对static的理解不够深入
【105】﹌゜  FantasticGirl° (642175216) 11:25:05
如果adcd的值变化之后.你留意第一次进入函数时a在栈中的地址
【105】﹌゜  FantasticGirl° (642175216) 11:25:42
就只知道值不对.也不会去跟一跟.为啥不对.把所有问题都怪到MDK上

使用特权

评论回复
13
sunmeat|  楼主 | 2014-10-27 14:34 | 只看该作者
【105】﹌゜  FantasticGirl° (642175216) 11:26:16
还有.不同的C编译器.对于一些细节的处理.有增强.或者删减.都是有可能的
【105】﹌゜  FantasticGirl° (642175216) 11:27:10
gcc armcc ml 这些都是不可能完全一致还有大名鼎鼎的 LVM
【105】﹌゜  FantasticGirl° (642175216) 11:28:38
个人觉得最好用.就是这个

使用特权

评论回复
14
sunmeat|  楼主 | 2014-10-27 14:34 | 只看该作者
【150】MP(183350168) 11:29:03
尽量不要写依赖于编译器的代码
【150】MP(183350168) 11:29:10
会把自己玩死的
【105】﹌゜  FantasticGirl° (642175216) 11:30:23
有些编译器确实有差异性
【105】﹌゜  FantasticGirl° (642175216) 11:30:39
上面的这个问题.一看就知道static 带有引用特性
【105】﹌゜  FantasticGirl° (642175216) 11:31:13
static我都用得很少的.要么就是文件作用域
【105】﹌゜  FantasticGirl° (642175216) 11:31:28
不搞成函数内部
【105】﹌゜  FantasticGirl° (642175216) 11:31:46
这些东西..要么就在堆.要么就在栈
【105】﹌゜  FantasticGirl° (642175216) 11:32:48
所以C++就搞出了命名空间..
【105】﹌゜  FantasticGirl° (642175216) 11:33:30
一些常用的东西.频繁使用的.搞成局部是不妥的.

使用特权

评论回复
15
sunmeat|  楼主 | 2014-10-27 14:35 | 只看该作者
【150】MP(183350168) 11:34:58
尽量用局部变量
【150】MP(183350168) 11:35:11
软件工程的原则是,强内聚,弱耦合
【105】﹌゜  FantasticGirl° (642175216) 11:35:35
你可以做到模块内部
【105】﹌゜  FantasticGirl° (642175216) 11:35:52
那个是针对模块之间的
【105】﹌゜  FantasticGirl° (642175216) 11:36:17
不是针对模块内部的函数之间
【105】﹌゜  FantasticGirl° (642175216) 11:37:09
一个模块几个文件.这几个文件内部怎么分配资源.编写代码的协调.不用开放外部的就隐藏文件外访问属性.
【105】﹌゜  FantasticGirl° (642175216) 11:37:21
需要开放外部访问的.就做成全局
【105】﹌゜  FantasticGirl° (642175216) 11:38:04
你把所有变量全部放局部..遇到一些算法复杂度很高的.又很频繁的.首先就会影响效率.还带来不确定性

使用特权

评论回复
16
sunmeat|  楼主 | 2014-10-27 14:35 | 只看该作者
【105】﹌゜  FantasticGirl° (642175216) 11:38:19
试试DSP算**
【103】Realsense-frank(493179413) 11:39:50
双击查看原图
【105】﹌゜  FantasticGirl° (642175216) 11:40:35
软件工程的原则 :强内聚 .弱耦合 就是这个意思
【105】﹌゜  FantasticGirl° (642175216) 11:41:03
模块内部 精心设计.模块直接只留接口
【105】﹌゜  FantasticGirl° (642175216) 11:41:11
一般不会暴露变量
【105】﹌゜  FantasticGirl° (642175216) 11:41:25
就算要访问.也返回一个结构体什么的

使用特权

评论回复
17
sgj245609615| | 2014-10-27 20:29 | 只看该作者
有没有结果 请明示

使用特权

评论回复
18
HORSE7812| | 2014-10-28 14:34 | 只看该作者
:L

使用特权

评论回复
19
sunmeat|  楼主 | 2014-10-29 07:51 | 只看该作者
sgj245609615 发表于 2014-10-27 20:29
有没有结果 请明示

结果就是,使用方法不当,最好都初始化

使用特权

评论回复
20
shdjdq| | 2014-10-31 08:56 | 只看该作者
最后我把数据搬到外面:
//long aaa=0;
typedef struct
{
  int  in;                   
  int  out;                  
} flter;       
还是不对。
--------------------------------------------------------
程序一点都没改,加个额外的定义,下面这样数据就对了。
long aaa=0;   //   不做任何用途
typedef struct
{
  int  in;                   
  int  out;                  
} flter;       

不知怎样解释这个现象。

使用特权

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

本版积分规则

208

主题

2132

帖子

13

粉丝