[ZLG-ARM] (uint32)(((DataQueue *)0) 什么意思

[复制链接]
2738|9
 楼主| myoiqq 发表于 2008-2-26 18:05 | 显示全部楼层 |阅读模式
在数据队列创建函数<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;uint8&nbsp;QueueCreate(void&nbsp;*Buf,<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;uint32&nbsp;SizeOfBuf,<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;uint8&nbsp;(*&nbsp;ReadEmpty)(),<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;uint8&nbsp;(*&nbsp;WriteFull)()<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;)<br />{<br />&nbsp;&nbsp;&nbsp;&nbsp;DataQueue&nbsp;*Queue;<br />&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;if&nbsp;(Buf&nbsp;!=&nbsp;NULL&nbsp;&&&nbsp;SizeOfBuf&nbsp;&gt=&nbsp;(sizeof(DataQueue)))&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;/*&nbsp;判断参数是否有效&nbsp;*/<br />&nbsp;&nbsp;&nbsp;&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Queue&nbsp;=&nbsp;(DataQueue&nbsp;*)Buf;<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;OS_ENTER_CRITICAL();<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;/*&nbsp;初始化结构体数据&nbsp;*/<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Queue-&gtMaxData&nbsp;=&nbsp;(SizeOfBuf&nbsp;-&nbsp;(uint32)(((DataQueue&nbsp;*)0)-&gtBuf))&nbsp;/&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;sizeof(QUEUE_DATA_TYPE);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Queue-&gtEnd&nbsp;=&nbsp;Queue-&gtBuf&nbsp;+&nbsp;Queue-&gtMaxData;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;/*&nbsp;计算数据缓冲的结束地址&nbsp;*/<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Queue-&gtOut&nbsp;=&nbsp;Queue-&gtBuf;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Queue-&gtIn&nbsp;=&nbsp;Queue-&gtBuf;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Queue-&gtNData&nbsp;=&nbsp;0;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Queue-&gtReadEmpty&nbsp;=&nbsp;ReadEmpty;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Queue-&gtWriteFull&nbsp;=&nbsp;WriteFull;<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;OS_EXIT_CRITICAL();<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;return&nbsp;QUEUE_OK;<br />&nbsp;&nbsp;&nbsp;&nbsp;}<br />&nbsp;&nbsp;&nbsp;&nbsp;else<br />&nbsp;&nbsp;&nbsp;&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;return&nbsp;NOT_OK;<br />&nbsp;&nbsp;&nbsp;&nbsp;}<br />}<br />中计算最大数据数目然后给了Queue-&gtMaxData,试问一下(uint32)(((DataQueue&nbsp;*)0)-&gtBuf什么意思呢?<br />
dld2 发表于 2008-2-26 18:32 | 显示全部楼层

有意思

实际上就是DataQueue结构中buf这个成员变量在结构中的相对位置。<br /><br />把0强制转换为DataQueue类型的指针,就是为了计算这个偏移值。
 楼主| myoiqq 发表于 2008-2-26 19:25 | 显示全部楼层

补充

typedef&nbsp;struct&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;QUEUE_DATA_TYPE&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*Out;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;/*&nbsp;指向数据输出位置&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*/<br />&nbsp;&nbsp;&nbsp;&nbsp;QUEUE_DATA_TYPE&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*In;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;/*&nbsp;指向数据输入位置&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*/<br />&nbsp;&nbsp;&nbsp;&nbsp;QUEUE_DATA_TYPE&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*End;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;/*&nbsp;指向Buf的结束位置&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*/<br />&nbsp;&nbsp;&nbsp;&nbsp;uint16&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;NData;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;/*&nbsp;队列中数据个数&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*/<br />&nbsp;&nbsp;&nbsp;&nbsp;uint16&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;MaxData;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;/*&nbsp;队列中允许存储的数据个数&nbsp;*/<br />&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;uint8&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;(*&nbsp;ReadEmpty)();&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;/*&nbsp;读空处理函数&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*/<br />&nbsp;&nbsp;&nbsp;&nbsp;uint8&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;(*&nbsp;WriteFull)();&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;/*&nbsp;写满处理函数&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*/<br />&nbsp;&nbsp;&nbsp;&nbsp;QUEUE_DATA_TYPE&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Buf[1];&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;/*&nbsp;存储数据的空间&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*/<br />}&nbsp;DataQueue;<br />
 楼主| myoiqq 发表于 2008-2-26 19:41 | 显示全部楼层

dld2 说法不能理解

我觉得dld2&nbsp;说法还是不能理解,如果是得到Buf的首地址,那么这个首地址是如何计算数据的长度呢?计算公式?
dld2 发表于 2008-2-26 19:52 | 显示全部楼层

这样说:

Queue-&gtMaxData&nbsp;=&nbsp;(SizeOfBuf&nbsp;-&nbsp;(uint32)(((DataQueue&nbsp;*)0)-&gtBuf))&nbsp;/&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;sizeof(QUEUE_DATA_TYPE);<br />//队列中的最大数据单元数量&nbsp;=&nbsp;(总缓冲区长度&nbsp;-&nbsp;(从Out到WriteFull所占的空间的大小))/数据单元的大小
 楼主| myoiqq 发表于 2008-2-26 19:58 | 显示全部楼层

讨论

(总缓冲区长度&nbsp;-&nbsp;(从Out到WriteFull所占的空间的大小))/数据单元的大小<br />这样得到的应该是从开始到Out的数据单元个数。<br />
dld2 发表于 2008-2-26 20:04 | 显示全部楼层

对不上点,呵呵

  
 楼主| myoiqq 发表于 2008-2-26 20:10 | 显示全部楼层

无语

其实完全可以有许多让人更加容易理解的做法。不知道为什么非要这么写
dld2 发表于 2008-2-26 20:23 | 显示全部楼层

其实蛮精妙的

原因之一:QUEUE_DATA_TYPE是个宏,可以定义为int、char、或者一个结构。<br /><br />就是说:这是一个存储空间外部分配、总长度可变、数据单元大小可配置的通用队列。<br />并且提供了读空和写满时的回调函数。<br /><br />不知道这段代码是哪里来的。
wlsui 发表于 2008-2-27 00:04 | 显示全部楼层

RE:

这段代码是ZLG的数据队列中间件中的代码,这样写的好处是更灵活,不受所声明类型的具体实现限制
您需要登录后才可以回帖 登录 | 注册

本版积分规则

12

主题

38

帖子

0

粉丝
快速回复 在线客服 返回列表 返回顶部