搜索
bottom↓
回复: 299

如何尽量地避免使用全局变量呢?

  [复制链接]

出0入0汤圆

发表于 2014-9-28 16:02:34 | 显示全部楼层 |阅读模式


       习惯了使用全局变量,感觉这不是一个好的习惯,可又好难摆脱全局变量

       比如:某个设备的一些参数,可以由用户通过按键修改,在修改的时候需要从显示板中实时显示出来,
       修改完后,重新修改的参数生效,设备将根据这些新的参数运转..............想想,还是只会全局变量

       不知道有什么好的方法来尽量避免使用全局变量

阿莫论坛20周年了!感谢大家的支持与爱护!!

一只鸟敢站在脆弱的枝条上歇脚,它依仗的不是枝条不会断,而是自己有翅膀,会飞。

出0入0汤圆

发表于 2014-9-28 16:06:56 | 显示全部楼层
使用一个get_xxx和set_xxx接口函数应该可以防止全局变量漫天飞吧。

出0入0汤圆

发表于 2014-9-28 16:10:06 | 显示全部楼层
全局变量没啥不好的吧 又不是c++底层大量都是全局变量。。

出0入0汤圆

发表于 2014-9-28 16:10:08 | 显示全部楼层
將這箇全局變量刪掉,看你怎麼實現和原來一樣的功能。

出0入0汤圆

发表于 2014-9-28 16:11:54 | 显示全部楼层
nome 发表于 2014-9-28 16:10
全局变量没啥不好的吧 又不是c++底层大量都是全局变量。。

編譯器喜歡全局變量,一箇地址就訪問到了。
不喜歡全局變量的,是人。
人設計機器,就是要讓機器做人不喜歡做的事情。

出0入0汤圆

发表于 2014-9-28 16:14:16 | 显示全部楼层
2楼的建议不错

出0入0汤圆

发表于 2014-9-28 16:15:53 | 显示全部楼层
我也一直在想这个问题 不知道怎么能减少全局变量 坐等讲解

出30入0汤圆

发表于 2014-9-28 16:19:08 | 显示全部楼层
我觉得需要好好考虑你的程序,我遇到一个例子,就是用函数参数传递,去掉一个全局变量的。

出0入0汤圆

发表于 2014-9-28 16:20:09 | 显示全部楼层
关键在于业务分割清楚,程序模块化!全局变量多少关系不大,最怕在多个模块中直接操作全局变量,这样会把各个模块之间的逻辑关系搞复杂!

出0入0汤圆

发表于 2014-9-28 16:48:33 | 显示全部楼层
不用全局變量也不是不可以,但是要犧牲Flash空間,多一些額外的RAM,還有多一些執行時間。
一刀切也不好,本來有些芯片內存就少,不用全局怎麼辦?看實際情況酌量使用也沒壞處

出0入0汤圆

发表于 2014-9-28 16:58:34 | 显示全部楼层
我一般把全局变量分类,用struct分成不同模块,看起来清爽多了。

出0入0汤圆

发表于 2014-9-28 17:05:37 | 显示全部楼层
使用结构体分类,把全局变量放在一个.c里面,如果外部函数要调用的话,就使用相应API。这样变量就不会满天飞啦

出0入0汤圆

发表于 2014-9-28 17:09:14 | 显示全部楼层
同样想解决,

出0入0汤圆

发表于 2014-9-28 17:09:19 | 显示全部楼层
C++ 学的不够彻底,干脆改宏编比较好.

出0入0汤圆

发表于 2014-9-28 17:18:33 | 显示全部楼层
打包好函数,或者使用一种统一的命名规则来命名全局变量也没啥不好。听说有一种叫匈牙利命名法则,没用过,楼主可以尝试下。

出0入0汤圆

发表于 2014-9-28 17:19:38 | 显示全部楼层
等大牛解答,

出0入0汤圆

 楼主| 发表于 2014-9-28 17:21:48 | 显示全部楼层
dxgdsx 发表于 2014-9-28 16:06
使用一个get_xxx和set_xxx接口函数应该可以防止全局变量漫天飞吧。

感觉差不多,不过多了一层封装比直接使用应该会好一点

出0入0汤圆

发表于 2014-9-28 17:23:11 | 显示全部楼层
我感觉用用也没什么关系。
关键是保持头脑清醒

出0入0汤圆

 楼主| 发表于 2014-9-28 17:23:22 | 显示全部楼层
nome 发表于 2014-9-28 16:10
全局变量没啥不好的吧 又不是c++底层大量都是全局变量。。

就是感觉挺乱的,有一个朋友修改他自己以前已经生产的程序,结果出问题了,造成一万多要返工,就是因为全局变量乱用了

出0入0汤圆

 楼主| 发表于 2014-9-28 17:24:09 | 显示全部楼层
qlb1234 发表于 2014-9-28 16:10
將這箇全局變量刪掉,看你怎麼實現和原來一樣的功能。

最后按了 “Ctrl+Z” 把删掉的恢复回来了

出0入0汤圆

 楼主| 发表于 2014-9-28 17:25:39 | 显示全部楼层
ts-fjw 发表于 2014-9-28 16:15
我也一直在想这个问题 不知道怎么能减少全局变量 坐等讲解

       一起学习

出0入0汤圆

发表于 2014-9-28 17:25:55 | 显示全部楼层
本帖最后由 ahong2hao 于 2014-9-28 17:27 编辑

现在的单片机内存都够大,全局变量没什么不好啊,在一个文件里面统一定义不就可以了。比用指针传来传去好多了。
关键还是要协调好底层驱动与上层应用关系

出0入0汤圆

 楼主| 发表于 2014-9-28 17:26:46 | 显示全部楼层
pandong 发表于 2014-9-28 16:19
我觉得需要好好考虑你的程序,我遇到一个例子,就是用函数参数传递,去掉一个全局变量的。 ...

我看过农民讲习所的《通用程序设计》,里面好像是用消息队列的,不过还没学会

出0入0汤圆

发表于 2014-9-28 17:27:19 | 显示全部楼层
同求答案呢

出0入0汤圆

 楼主| 发表于 2014-9-28 17:27:34 | 显示全部楼层
abbott 发表于 2014-9-28 16:20
关键在于业务分割清楚,程序模块化!全局变量多少关系不大,最怕在多个模块中直接操作全局变量,这样会把各 ...

这个“最怕在多个模块中直接操作全局变量,这样会把各个模块之间的逻辑关系搞复杂!”

才是我现在最头痛的

出0入0汤圆

 楼主| 发表于 2014-9-28 17:30:04 | 显示全部楼层
farfar 发表于 2014-9-28 16:48
不用全局變量也不是不可以,但是要犧牲Flash空間,多一些額外的RAM,還有多一些執行時間。
一刀切也不好, ...

以前用过一些OTP的单片机,才64或32字节的RAM,基本上全部都是全局变量

出0入0汤圆

发表于 2014-9-28 17:36:16 | 显示全部楼层
同求解,占位,留贴

出0入0汤圆

发表于 2014-9-28 17:40:32 来自手机 | 显示全部楼层
我也想解决这个问题

出0入0汤圆

发表于 2014-9-28 17:49:20 | 显示全部楼层
同样是全局变量漫天飞  希望能有什么解决办法~

出0入0汤圆

发表于 2014-9-28 17:55:25 | 显示全部楼层
我是将全局变量放在一个文件中做定义,有逻辑关系的定义成结构体

出0入8汤圆

发表于 2014-9-28 17:56:11 | 显示全部楼层
最好的方法是封装到一个结构体中,一个功能模块的变量全部封装到里面, 其他模块要修改变量,就全部使用对外的接口函数。  关键不在于是否全局  而在于模块的结构设计是否合理。

出0入0汤圆

发表于 2014-9-28 18:54:07 | 显示全部楼层
没有开窍,多写多看多想。

出0入0汤圆

发表于 2014-9-28 18:56:07 | 显示全部楼层
qlb1234 发表于 2014-9-28 16:11
編譯器喜歡全局變量,一箇地址就訪問到了。
不喜歡全局變量的,是人。
人設計機器,就是要讓機器做人不喜 ...

感觉很像老师啊

出0入0汤圆

发表于 2014-9-28 18:58:10 | 显示全部楼层
楼主看看 qp状态机里的仿对象化编程或许能得到些启发。

出0入0汤圆

发表于 2014-9-28 19:00:46 | 显示全部楼层
如果你的系统不是很大的情况下,全局变量还是一个比较好的方式的

出0入0汤圆

发表于 2014-9-28 19:21:53 | 显示全部楼层
简单的程序就不用纠结那么多,用就是,给每个全局变量拟一个有意义的名字!宁长勿短

复杂一点的时候,用struct封装起来,用struct指针传递

无论怎么用,小白觉得头脑清醒是最关键

出0入0汤圆

发表于 2014-9-28 22:18:20 | 显示全部楼层
给全局变量换个马甲仍然是全局变量呀。我觉得在程序结构及算法上多下点功夫才是正道。

出0入4汤圆

发表于 2014-9-28 22:35:43 | 显示全部楼层
先不要纠结于斯,等搞好了模块化、层次化之后,这些就有解了

出90入4汤圆

发表于 2014-9-28 22:51:59 来自手机 | 显示全部楼层
函数的参数用指针

出0入0汤圆

发表于 2014-9-29 00:22:31 | 显示全部楼层
使用OS,每个任务内部自己定义变量 , 任务与任务间要通讯,通过发消息或者邮箱,将需要传送的变量发给别的任务 ,

出0入0汤圆

发表于 2014-9-29 00:34:35 | 显示全部楼层
就两个字, 封装

出0入296汤圆

发表于 2014-9-29 01:03:32 | 显示全部楼层
本帖最后由 Gorgon_Meducer 于 2014-9-29 01:07 编辑

使用二楼的方法,好处非常多,不仅不会降低效率,还会降低代码尺寸,
实现对变量的访问权限控制(只读,只写),可以一劳永逸的实现对变量的
原子保护,可以在读写的时候进行有效性检查,最后调试的时候方便追踪
谁对变量进行了访问,也可以填写调试值。这就是面向接口开发的好处。

在我的团队里,是严禁使用全局变量的,因为明确有更好的解决方案。
只允许使用静态变量。

出0入0汤圆

发表于 2014-9-29 02:05:20 来自手机 | 显示全部楼层
42楼是高见,11楼可以参考

出0入0汤圆

发表于 2014-9-29 06:31:29 来自手机 | 显示全部楼层
全局变量对程序维护肯定有些影响,但要说性能,肯定最好。
上面提到C的变量封装方法,一直不太感冒。感觉对后期维护人员是种负担,增加了程序理解难度,多绕了个圈子。

出100入143汤圆

发表于 2014-9-29 06:47:37 来自手机 | 显示全部楼层
Gorgon_Meducer 发表于 2014-9-29 01:03
使用二楼的方法,好处非常多,不仅不会降低效率,还会降低代码尺寸,
实现对变量的访问权限控制(只读,只写 ...

这也是相对的,静态变量依赖历史变量值,会使的函数失去可重入性,多任务调用不方便

出0入0汤圆

发表于 2014-9-29 08:20:39 | 显示全部楼层
程序量大的话,全局变量不太好管理。如果是不大的程序,使用全局也很方便。

出0入0汤圆

发表于 2014-9-29 08:25:50 | 显示全部楼层
看别人写的很清楚明白,到自己写的时候就一塌糊涂了

出0入0汤圆

发表于 2014-9-29 08:27:39 | 显示全部楼层
过来学习学习 , 常用到全局变量

出0入0汤圆

发表于 2014-9-29 08:33:52 | 显示全部楼层
这个是个比较系统的问题,设计到系统的架构设计,逻辑分层等,这有这些做的合理,才能减少全局变量

出0入0汤圆

发表于 2014-9-29 08:45:24 | 显示全部楼层
坐等学习中。。。。。。。。。。。。

出0入0汤圆

发表于 2014-9-29 09:49:56 | 显示全部楼层
程序复杂的还是封装一下,简单的无所谓

出0入0汤圆

发表于 2014-9-29 10:21:19 | 显示全部楼层
將對全局變量的訪問,替換成用函數訪問,或者是放入結構體,這都無法從根本上解決問題。
等一下,甚麼問題?使用全局變量會導致甚麼問題?
看看StackOverFlow的人怎麼回答。
The problem with global variables is that since every function has access to these, it becomes increasingly hard to figure out which functions actually read and write these variables.

To understand how the application works, you pretty much have to take into account every function which modifies the global state. That can be done, but as the application grows it will get harder to the point of being virtually impossible (or at least a complete waste of time).

作爲一個長期維護寫得超爛的(臺灣人寫的)代碼的人,我可以描述下,當你發現機器運行不正常,是因爲有某箇全局變量被改寫,而你嘗試用全局搜索的方法,來找出改寫這箇全局變量的地方,卻發現修改這箇全局變量的地方竟然有500處的時候,是甚麼感受。哦,或者我不用舉例,你都已經明白了,因爲至少你是一個程序員。
考慮一下以下的例子。
  1. int cola_left;
  2. void display_how_many_cola(void)
  3. {
  4.     printf("%d", cola_left);
  5. }
  6. void count_cola(void)
  7. {
  8.     cola_left = count();
  9. }
复制代码

作爲一部自動販賣機,無論是顯示屏,還是內部的點貨員,都需要知道而今還剩下多少瓶可樂。如果你的功能僅限於此,那麼,很好,程序思路很清晰。但是如果日後,機器內部新增了一個促銷員,他根據庫存來決定售賣價格,這時就多一個人要瞭解這箇全局變量了。如果生意做大了,開始實行會員制,會員可以在缺貨的情況下仍然買到可樂,這時是不是需要增加一個人,去留意庫存情況?突然有一日,一個會員嚮你抱怨,說他買不到可樂。你質問會員管理員,他卻說“我在前一秒,明明見到還有1瓶可樂的,不知道怎麼的就不見了。”幾經週轉,纔發現是某個促銷員賣掉了這瓶可樂。雖然最終你仍然可以查出,但這不是很曲折麼?
這就是問題:如何纔能使你更輕鬆地檢查出,是誰在攪鬼,和怎麼防止日後有更多的人去搗亂。
  1. int salesman(int cola_on_sale)
  2. {
  3.     return  bottles_sold;
  4. }
  5. void vip_manager(int * cola_reserve)
  6. {
  7. }
  8. void main(void)
  9. {
  10.     int cola = 10;
  11.     while(1)
  12.     {
  13.         vip_manager(&cola);
  14.         if(cola > how_many_vips)
  15.         {
  16.             cola -= salesman(cola - how_many_vips);
  17.         }
  18.     }
  19. }
复制代码

這樣做,不但減少了全局搜索cola這箇變量的結果,而且還從根本上限制了促銷員的權利。
當然,這衹是其中一種方法。但無論你做甚麼,都應該是讓你的程序變得更加容易讀,和更容易在出問題時找到原因。
請記住,全局變量爲甚麼不好。在你的工程裏,這種壞處存不存在。出問題時,需要多少時間去分析。和你可以通過甚麼途徑,去做得更好。

出0入0汤圆

发表于 2014-9-29 10:29:32 | 显示全部楼层
Gorgon_Meducer 发表于 2014-9-29 01:03
使用二楼的方法,好处非常多,不仅不会降低效率,还会降低代码尺寸,
实现对变量的访问权限控制(只读,只写 ...

在你们团队加static的文件内全局变量允许用么?

出0入0汤圆

发表于 2014-9-29 12:24:57 | 显示全部楼层
习惯把全局变量分类放到结构体里,看着清楚一点

出0入296汤圆

发表于 2014-9-29 12:28:21 | 显示全部楼层
zzh90513 发表于 2014-9-29 06:47
这也是相对的,静态变量依赖历史变量值,会使的函数失去可重入性,多任务调用不方便 ...

比较要注意对象,我说的都是针对使用全局变量来说的,你说的是可重入性。完全是另外一个话题。

出0入296汤圆

发表于 2014-9-29 12:29:13 | 显示全部楼层
ilcvm 发表于 2014-9-29 10:29
在你们团队加static的文件内全局变量允许用么?


允许,这叫静态变量,使用受限

出0入296汤圆

发表于 2014-9-29 12:52:03 | 显示全部楼层
gycsy963 发表于 2014-9-29 06:31
全局变量对程序维护肯定有些影响,但要说性能,肯定最好。
上面提到C的变量封装方法,一直不太感冒。感觉对 ...

从性能上,如果开了inline,则函数法与全局变量操作无差别,如果没有开inline,则比全局变量法多了一次相对跳转,差不多4个周期的牺牲,
如果4个周期的牺牲并不发生在程序热点上,则这种开支是值得的,因为可以换取更好的维护性。
至于你说用面向接口的方式封装对静态变量的读取影响维护,这个我觉得需要认真探讨下,你先说说哪里不好,我们一一来讨论,只凭借一个
印象就下结论,实在是武断,我可以问你:你真的想清楚了么?我是真的想清楚了。

另外,我常用的编译器是IAR,一直开最高优化(speed和size),不考虑NC编译器。

出0入296汤圆

发表于 2014-9-29 12:52:36 | 显示全部楼层
qlb1234 发表于 2014-9-29 10:21
將對全局變量的訪問,替換成用函數訪問,或者是放入結構體,這都無法從根本上解決問題。
等一下,甚麼問題 ...

这就是面向接口开发对变量访问的validation例子。谢谢讲解。

出0入296汤圆

发表于 2014-9-29 12:54:25 | 显示全部楼层
nnmnnm 发表于 2014-9-29 12:24
习惯把全局变量分类放到结构体里,看着清楚一点

封装在结构体里面只是一种方式,虽然看着清楚,但是没有做到权限控制(read / write控制),多任务环境下也需要在所有访问的地方都增加一份
原子保护的代码。也无法统一做validation。

出0入0汤圆

发表于 2014-9-29 12:57:16 | 显示全部楼层
Gorgon_Meducer 发表于 2014-9-29 12:29
允许,这叫静态变量,使用受限

版主能说的更明白些么?
我一般这样: 参数比较多,使用static定义,使用指针+偏移/元素的方式,通过函数接口实现。

另:好久不见版主了啊, 版主的书到哪一阶段了?

出0入0汤圆

发表于 2014-9-29 13:56:06 | 显示全部楼层
我也觉得用全局变量顺手,做几个结构体,自己注意赋值就行了,还是很方便

出0入76汤圆

发表于 2014-9-29 14:03:46 | 显示全部楼层
比如像用于配置的“参数”类的变量, 一般情况下这类模块中的变量会比较多。
这种情况,如果单独封装每个变量的访问API接口,肯定不现实(接口太多了, 不符合模块接口尽量简单化原则)。
可以采用类似于stm32库函数的做法, 对这些参数进行打包封装为“结构体变量”类型, 并在h文件中导出。
在c文件中把这个参数定义为static类型(静态变量), 并实现读/写接口函数。

  1. // 模块接口h文件中:
  2. typedef struct {
  3.   Param_A;
  4.   Param_B;
  5.   Param_C;
  6. } User_Param_Typedef;

  7. bool ModuleName_SetParam(User_Param_Typedef *param);
  8. bool ModuleName_GetParam(User_Param_Typedef *param);

复制代码

  1. // 模块实现c文件中:
  2. static User_Param_Typedef user_param;
  3. static bool user_access_locked;

  4. bool ModuleName_SetParam(User_Param_Typedef *param)
  5. {
  6.   // 此处还可以增加对参数的保护特性
  7.   user_param.Param_A = param->Parma_A;
  8.   user_param.Param_B = param->Parma_B;
  9.   user_param.Param_C = param->Parma_C;
  10.   return true;
  11. }

  12. bool ModuleName_GetParam(User_Param_Typedef *param)
  13. {
  14.   // 此处还可以增加对参数的保护特性
  15.   param->Param_A = user_param.Parma_A;
  16.   param->Param_B = user_param.Parma_B;
  17.   param->Param_C = user_param.Parma_C;
  18.   return true;
  19. }
复制代码

  1. // app文件中:

  2. ...
  3. // 配置参数
  4. User_Param_Typedef  user_param;    // 临时变量(局部变量 ) 或 静态变量
  5. user_param.Param_A = 1;
  6. user_param.Param_B = 2;
  7. user_param.Param_C = 3;
  8. ModuleName_SetParam(&user_param);
  9. ...

  10. // 获取参数
  11. ModuleName_GetParam(&user_param);

复制代码


如果在应用中, 仅需要修改其中一个参数怎么办呢?  其实很简单, 根据上面的类似的方法修改, 增加基于 “基地址偏移量” 读/写的接口函数即可。

出0入0汤圆

发表于 2014-9-29 14:07:40 | 显示全部楼层
dxgdsx 发表于 2014-9-28 16:06
使用一个get_xxx和set_xxx接口函数应该可以防止全局变量漫天飞吧。

同意

出0入0汤圆

发表于 2014-9-29 14:23:19 | 显示全部楼层
用全局变量有什么不好的,做音频处理就喜欢用全局变量,不会出现爆音。

出0入296汤圆

发表于 2014-9-29 14:31:01 | 显示全部楼层
foxpro2005 发表于 2014-9-29 14:03
比如像用于配置的“参数”类的变量, 一般情况下这类模块中的变量会比较多。
这种情况,如果单独封装每个变 ...

这也是一种不错的改良,我也一直在用。

出0入0汤圆

发表于 2014-9-29 15:55:14 | 显示全部楼层
heyj6969 发表于 2014-9-28 17:05
使用结构体分类,把全局变量放在一个.c里面,如果外部函数要调用的话,就使用相应API。这样变量就不会满天 ...

我现在就是使用结构体,不过模块之间都是直接访问的,有时候为了懒了,也是直接写操作,感觉好乱好危险

出0入0汤圆

发表于 2014-9-29 15:58:40 | 显示全部楼层
kebaojun305 发表于 2014-9-28 17:56
最好的方法是封装到一个结构体中,一个功能模块的变量全部封装到里面, 其他模块要修改变量,就全部使用对 ...

正在尝试使用这种方法

出0入0汤圆

发表于 2014-9-29 16:00:33 | 显示全部楼层
Gorgon_Meducer 发表于 2014-9-29 01:03
使用二楼的方法,好处非常多,不仅不会降低效率,还会降低代码尺寸,
实现对变量的访问权限控制(只读,只写 ...

谢谢版主,现在在尝试使用2楼和62楼的方法

出0入0汤圆

发表于 2014-9-29 16:03:06 | 显示全部楼层
qlb1234 发表于 2014-9-29 10:21
將對全局變量的訪問,替換成用函數訪問,或者是放入結構體,這都無法從根本上解決問題。
等一下,甚麼問題 ...

谢谢前辈!好好理解您所讲的

出0入0汤圆

发表于 2014-9-29 16:05:42 | 显示全部楼层
本帖最后由 ijlc1314 于 2014-9-29 16:06 编辑
bbglx 发表于 2014-9-28 18:58
楼主看看 qp状态机里的仿对象化编程或许能得到些启发。


QP状态机,正好赼着国庆放假好好了解一下

出0入0汤圆

发表于 2014-9-29 16:11:24 | 显示全部楼层
qlb1234 发表于 2014-9-28 16:11
編譯器喜歡全局變量,一箇地址就訪問到了。
不喜歡全局變量的,是人。
人設計機器,就是要讓機器做人不喜 ...

给你点赞~

出0入0汤圆

发表于 2014-9-29 16:24:34 | 显示全部楼层
如果有几万个全局变量该怎么搞?

出0入296汤圆

发表于 2014-9-29 16:32:45 | 显示全部楼层
formatme 发表于 2014-9-29 16:24
如果有几万个全局变量该怎么搞?

这种工程是怎么规划出来的?

出0入0汤圆

发表于 2014-9-29 16:43:09 | 显示全部楼层
稍复杂点的就有那么多啊,参数太多.

出0入0汤圆

发表于 2014-9-29 16:44:28 | 显示全部楼层
Gorgon_Meducer 发表于 2014-9-29 16:32
这种工程是怎么规划出来的?

MTK代碼,輕鬆上千。

出0入0汤圆

发表于 2014-9-29 16:44:56 | 显示全部楼层
本帖最后由 ilcvm 于 2014-9-29 16:48 编辑
foxpro2005 发表于 2014-9-29 14:03
比如像用于配置的“参数”类的变量, 一般情况下这类模块中的变量会比较多。
这种情况,如果单独封装每个变 ...


我觉得最根本应该是减少模块间的参数传递,譬如说你要输出电机控制PID的所有配置参数到串口,应该是在电机模块加个外部函数motorPrintParams(),而不是让通信或其他模块获取所有参数然后再输出到串口。对于你那种输出结构体定义然后通过指针传递我也有用,但基本可免则免。

出0入0汤圆

发表于 2014-9-29 16:49:27 | 显示全部楼层
用接口函数,这个在多人协作的时候比较管用,省的别人把自己内部用的量莫名其妙的给改了

出0入296汤圆

发表于 2014-9-29 17:01:43 | 显示全部楼层
qlb1234 发表于 2014-9-29 16:44
MTK代碼,輕鬆上千。

规划好,至少可以限定在模块内,不要说总数。

出0入0汤圆

发表于 2014-9-29 17:01:54 | 显示全部楼层
搬个板凳搞学习

出0入0汤圆

发表于 2014-9-29 17:15:55 | 显示全部楼层
qlb1234 发表于 2014-9-29 10:21
將對全局變量的訪問,替換成用函數訪問,或者是放入結構體,這都無法從根本上解決問題。
等一下,甚麼問題 ...

怎么做到空白处的字不显示的,偶像。

出0入0汤圆

发表于 2014-9-29 17:22:16 | 显示全部楼层
gujiamao_love 发表于 2014-9-29 17:15
怎么做到空白处的字不显示的,偶像。

桌面版底色:#eeeeee
移動版底色:White

出0入0汤圆

发表于 2014-9-29 18:06:58 | 显示全部楼层
看了大家的讨论,我一看我的程序,吓尿了~~

光一组AD值全局变量,就占了4k字节~ 如果把它设置成局部变量,那退出子程序,不就没了~

出0入0汤圆

发表于 2014-9-29 18:10:46 | 显示全部楼层
注意尽量把全局变量名称搞得独特些,比如字符长些,不易与其他变量混淆就好。

出0入0汤圆

发表于 2014-9-29 18:35:15 | 显示全部楼层
何必,照你们这样,编译器干脆就不要允许全局变量算了

出0入0汤圆

发表于 2014-9-29 21:26:38 来自手机 | 显示全部楼层
孩子莫悲伤 发表于 2014-9-29 18:06
看了大家的讨论,我一看我的程序,吓尿了~~

光一组AD值全局变量,就占了4k字节~ 如果把它设置成 ...

你这个是缓冲区吧,没办法的

出0入0汤圆

发表于 2014-9-29 21:41:47 | 显示全部楼层
业余选手,连结构化都不会,只会一口气全部写在一起。

出0入0汤圆

发表于 2014-9-30 06:33:31 | 显示全部楼层
一般来说,就是讲全局变量封装在结构体里面。各个函数通过结构体指针的形式传入参数。
一个结构体的实例,可以理解为一个对象。
如果结构体里面有大的缓冲区,则配合malloc动态分配。

出0入0汤圆

发表于 2014-9-30 06:44:47 | 显示全部楼层
一直用全局变量又不开优化的的飘过

出0入0汤圆

发表于 2014-9-30 09:03:41 | 显示全部楼层
简单的应用全局不多,用起来无所谓的。复杂的或者后续要持续升级的,还是要学习封装的方法,通过函数来修改保护,或者更简单点用用结构体式的全局变量,也能耗很多

出0入0汤圆

发表于 2014-9-30 09:19:49 | 显示全部楼层
感觉还是不用全局的原因还是为了可读性强,避免出bug。二楼的是模块常用的封装方法。这样耦合性就变低了。

出0入0汤圆

 楼主| 发表于 2014-9-30 10:44:09 | 显示全部楼层
孩子莫悲伤 发表于 2014-9-29 18:06
看了大家的讨论,我一看我的程序,吓尿了~~

光一组AD值全局变量,就占了4k字节~ 如果把它设置成 ...

您这是做缓冲区的吧

出0入0汤圆

 楼主| 发表于 2014-9-30 10:45:42 | 显示全部楼层
albert.hu 发表于 2014-9-30 09:03
简单的应用全局不多,用起来无所谓的。复杂的或者后续要持续升级的,还是要学习封装的方法,通过函数来修改 ...

是啊,不过接口设计感觉也挺难的

出0入0汤圆

发表于 2014-9-30 11:02:33 | 显示全部楼层
自古二楼出真相

出0入0汤圆

发表于 2014-9-30 12:37:12 | 显示全部楼层
我觉得全局变量挺好的。干嘛包那么多层?mcu又不是windows

出0入0汤圆

发表于 2014-10-1 11:23:06 来自手机 | 显示全部楼层
全局变量,局部变量用途不一样,函数内部的,没有必要用全局的

出0入0汤圆

发表于 2014-10-1 15:22:25 | 显示全部楼层
用static 局部变量就行

出70入0汤圆

发表于 2014-10-1 16:28:29 | 显示全部楼层
可以读下开源操作系统的代码。只要做到全局变量用结构体归好类,一个函数要是涉及到操作外部变量的尽量用指针实现。我觉得小型工程可以随便用全局变量,你搞复杂了,排查太麻烦。

出10入0汤圆

发表于 2014-10-1 22:35:25 来自手机 | 显示全部楼层
mark下!!

出0入0汤圆

发表于 2014-10-1 22:51:53 | 显示全部楼层
看到好多亮点 mark
头像被屏蔽

出0入0汤圆

发表于 2014-10-1 23:40:11 | 显示全部楼层
提示: 作者被禁止或删除 内容自动屏蔽
回帖提示: 反政府言论将被立即封锁ID 在按“提交”前,请自问一下:我这样表达会给举报吗,会给自己惹麻烦吗? 另外:尽量不要使用Mark、顶等没有意义的回复。不得大量使用大字体和彩色字。【本论坛不允许直接上传手机拍摄图片,浪费大家下载带宽和论坛服务器空间,请压缩后(图片小于1兆)才上传。压缩方法可以在微信里面发给自己(不要勾选“原图),然后下载,就能得到压缩后的图片】。另外,手机版只能上传图片,要上传附件需要切换到电脑版(不需要使用电脑,手机上切换到电脑版就行,页面底部)。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

手机版|Archiver|amobbs.com 阿莫电子技术论坛 ( 粤ICP备2022115958号, 版权所有:东莞阿莫电子贸易商行 创办于2004年 (公安交互式论坛备案:44190002001997 ) )

GMT+8, 2024-3-29 08:57

© Since 2004 www.amobbs.com, 原www.ourdev.cn, 原www.ouravr.com

快速回复 返回顶部 返回列表