打印

不提倡使用全局变量,2k数据该怎么办啊?所长出出招!

[复制链接]
9331|67
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
zhuhai2004|  楼主 | 2007-12-20 16:49 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
2K字节的数据需要被多个模块使用(显示、通讯<2种方式>)。如果只是事件驱动可以采用消息吧,可是这么多的变量在多个模块里面使用,是否只能采用全局变量的方式?那么以后要更改程序也是很麻烦的哦。

相关帖子

沙发
zhuhai2004|  楼主 | 2007-12-20 16:55 | 只看该作者

现在不都是提倡设计模块化嘛!

使用特权

评论回复
板凳
后学| | 2007-12-20 17:04 | 只看该作者

建议并不是绝对的,

再说了,
可以把数据模块封装起来,做一个读写函数啊,
还有,也可以借鉴驱动程序或进程间通信的方式啊,

使用特权

评论回复
地板
农民讲习所| | 2007-12-20 17:24 | 只看该作者

初始化使用消息传递数组(结构)指针

每个模块C内部用变量记录该指针。

使用特权

评论回复
5
zhuhai2004|  楼主 | 2007-12-20 19:30 | 只看该作者

如果模块需要以公共变量地址建表呢?

3楼:是不是把公共变量建立模块,自己的读写程序,相当是中转一次,速度以及开销都大。
4楼所长:很不幸的是这些变量的地址都要在通讯模块中建立表格,通过通讯数据项才可以查表知道特定变量的长度。
如:struct _AMDATA_{
    ama0[3],ama1[2],ama2[6],ama3[4],ama4[8],ama8[12],....
};
struct _AMDATA_ mAmData;
通讯读ama1[2]至ama8[12]的数据,那么就必须有这些地址对应建立起来的表格-长度;才有可能正确通讯。显示也是通过建立以变量地址为基准表格来完成的。

使用特权

评论回复
6
computer00| | 2007-12-20 21:16 | 只看该作者

建立一个全局变量会有什么危害吗?我觉得是百益而无一害

使用特权

评论回复
7
IceAge| | 2007-12-20 21:37 | 只看该作者

设计思路的问题

模块的层次构造必须清晰明了。通讯模块应该就是只管传输数据,而不应该关心数据的构成。其他模块填充数据,通讯模块传输就是了。

for example:

Communication Module:
bool Send(char* buffer, int length);

Data Processing Module:
mAmData.ama0[3] = 0;
...
Send((char*) &mAmData, sizeof(mAmData));

结构申明 可以暴露,但定义应该隐藏。

使用特权

评论回复
8
zhuhai2004|  楼主 | 2007-12-20 22:53 | 只看该作者

不那么简单,通讯协议指定读结构数据中的某块数据。

通讯的缓存不可以大于64,但是读取的数据可以小于256。只能将数据多次装入通讯缓存中,如果不了解数据结构怎么弄。

使用特权

评论回复
9
zhuhai2004|  楼主 | 2007-12-20 22:57 | 只看该作者

现在做法通过查数据结构(地址、长度)、分时装入数据、

使用特权

评论回复
10
汽车电子| | 2007-12-20 23:56 | 只看该作者

超过500字节,我习惯用全局变量

使用特权

评论回复
11
IceAge| | 2007-12-21 00:08 | 只看该作者

还是 设计 问题

通讯模块应尽量独立,减少耦合,最好不要干涉更高层的模块。

通讯只要提供数据缓存以及回调函数,以便发送完成后其他模块继续填充数据。
接受也是如此。

使用特权

评论回复
12
IceAge| | 2007-12-21 00:37 | 只看该作者

举个例子

typedef bool (* CALLBACK_TRANSFER)(char*, int, int);

通讯模块:
CALLBACK_TRANSFER callBack_FillBuffer;

void COMM_BeginTransfer(CALLBACK_TRANSFER fillBuffer)
{
    callBack_FillBuffer = fillBuffer;
}

void COMM_Send()
{
   char buffer[SIZE];
   ...
   for (i=0; i<MAX_COUNT; i++) {
      if ((*callBack_FillBuffer)(buffer, SIZE, i)) {
          if (! COMM_Send_via_Port(buffer, SIZE)) {   //Wrap the data and Send
             ...
          }
       }
       else 
          break;   //End.        
   }
}



其他 Module:
void BeginTransfer() {
     COMM_BeginTransfer(TransferData);
}

bool TransferData(char* buffer, int bufferSize, int index) {
  ...
}

使用特权

评论回复
13
hotpower| | 2007-12-21 00:49 | 只看该作者

听IceAge老师的永远不会错~~~闭眼跟着准对~~~

使用特权

评论回复
14
IceAge| | 2007-12-21 01:10 | 只看该作者

俺 “扑通“ 一声,掉到坑里

hotpower 闭眼跟着中 ... 

使用特权

评论回复
15
hotpower| | 2007-12-21 01:15 | 只看该作者

俺跟...哪怕刀山火海~~~

使用特权

评论回复
16
农民讲习所| | 2007-12-21 07:20 | 只看该作者

负责struct _AMDATA_ mAmData的是一个独立模块

struct _AMDATA_ mAmData应该是和通信协议有关的,通常是要被封装成一个完全独立的模块,上对着任务模块,使用消息传递接收模块的参数设置,消息发送通信队列的参数改变信息;下对着通信队列,按照协议进行解析活动。

使用特权

评论回复
17
后学| | 2007-12-21 08:44 | 只看该作者

全局变量会增加各模块间的耦合性,

程序大到一定规模后,维护和移植都很麻烦,

使用特权

评论回复
18
dld2| | 2007-12-21 09:04 | 只看该作者

多个模块访问同一组数据

通常是这样的:
有一个模块负责管理这组数据。
该数据在这个模块中采用静态变量的方式。也就是说,对该模块内部来说,数据是全局的;但外部不可见。
负责数据管理的模块,应向其它模块提供函数接口,使其它模块能够访问这些数据。参数和返回值一般用指针。

这个就是封装性。

使用特权

评论回复
19
john_light| | 2007-12-21 09:36 | 只看该作者

全局变量并非绝对不能用

有如goto

要不,就不会有全局变量这东西。

使用特权

评论回复
20
农民讲习所| | 2007-12-21 09:42 | 只看该作者

大家都对

水平都很高,至少比一两年前高不少。

公用全局变量只要作为系统支架,模块部分几乎不给外部用。

使用特权

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

本版积分规则

6

主题

93

帖子

0

粉丝