初用队列请教一下:如何理解?(uint32)(((DataQueue *)0)->Buf)
节选自queue.c文件<br />/************************************************************<br />** 函数名称: QueueCreate<br />** 功能描述: 初始化数据队列<br />** 输 入: Buf :为队列分配的存储空间地址<br />** SizeOfBuf:为队列分配的存储空间大小(字节)<br />** ReadEmpty:为队列读空时处理程序<br />** WriteFull:为队列写满时处理程序<br />** 输 出: NOT_OK:参数错误<br />** QUEUE_OK:成功<br />** 全局变量: 无<br />** 调用模块: OS_ENTER_CRITICAL,OS_EXIT_CRITICAL<br />********************************************************/<br />uint8 QueueCreate(void *Buf,uint32 SizeOfBuf,uint8 (* ReadEmpty)(),uint8 (* WriteFull)())<br />{<br /> DataQueue *Queue;<br /> uint8 k1,k2;<br /> if (Buf != NULL && SizeOfBuf >= (sizeof(DataQueue))) /* 判断参数是否有效 */<br /> {<br /> Queue = (DataQueue *)Buf;<br /><br /> OS_ENTER_CRITICAL();<br /> /* 初始化结构体数据 */<br /> <br /> Queue->MaxData = (SizeOfBuf - (uint32)(((DataQueue *)0)->Buf)) / sizeof(QUEUE_DATA_TYPE); <br /><br /> /* 计算队列可以存储的数据数目 */<br /> Queue->End = Queue->Buf + Queue->MaxData; /* 计算数据缓冲的结束地址 */<br /> Queue->Out = Queue->Buf;<br /> Queue->In = Queue->Buf;<br /> Queue->NData = 0;<br /> Queue->ReadEmpty = ReadEmpty;<br /> Queue->WriteFull = WriteFull;<br /><br /> OS_EXIT_CRITICAL();<br /><br /> return QUEUE_OK;<br /> }<br /> else<br /> {<br /> return NOT_OK;<br /> }<br />}<br /><br /><br />---------------------------------------------------------------<br />请问这句要如何理解?<br />Queue->MaxData = (SizeOfBuf - (uint32)(((DataQueue *)0)->Buf)) / sizeof(QUEUE_DATA_TYPE);<br /><br />相关定义如下:<br /><br />#ifndef QUEUE_DATA_TYPE<br />#define QUEUE_DATA_TYPE uint8<br />#endif<br /><br />//-----------------------------------------------------------------------------<br />typedef struct {<br /> QUEUE_DATA_TYPE *Out; /* 指向数据输出位置 */<br /> QUEUE_DATA_TYPE *In; /* 指向数据输入位置 */<br /> QUEUE_DATA_TYPE *End; /* 指向Buf的结束位置 */<br /> uint16 NData; /* 队列中数据个数 */<br /> uint16 MaxData; /* 队列中允许存储的数据个数 */<br /> <br /> uint8 (* ReadEmpty)(); /* 读空处理函数 */<br /> uint8 (* WriteFull)(); /* 写满处理函数 */<br /> QUEUE_DATA_TYPE Buf; /* 存储数据的空间 */<br />} DataQueue;<br />结构变量相应数据的地址偏移量
((DataQueue *)0)表示结构体自身,是这样吧!
((DataQueue *)0)->Buf 也就是说,<br /><br />((DataQueue *)0)表示结构体自身,是这样吧!<br /><br />BUF问题回复
lhzw2001 ,您好:<br /><br />这是一个非常巧妙的方法,定义起始地址为0,指向BUF空间首地址,方便下面语句计算空间大小。<br /><br />zlgarm_Li Baihua附议
(DataQueue *)表示后面的是一个“DataQueue”指针<br />后面的是0,那么表示该指针的值是0,那么这个“DataQueue”存放的地址就是0。<br />……<br />这样计算成员的偏移量就方便多了无
无多谢各位讲解,俺想通了!
虽然巧妙,但可读性不好
Queue->MaxData = (SizeOfBuf - ((uint32)&Queue->Buf - (uint32)&Queue->Out)) / sizeof(QUEUE_DATA_TYPE);<br /><br />这样写多数人都能看懂,比之前的要好看。确实是好懂多了!!!
1、不使用sizeof去取结构体变量的大小而是用这种方法应该是为了不多定义一个结构体变量或者程序的兼容不想用stdio.h文件。2、(DataQueue *)0把地址0 定义成结构体类型,可以减少变量,同时减少计算地址长度。
3、->Buf数组名就是地址,指向成员数组的地址是结构体最后一字节。
所以 (u32)(((DataQueue *)0)->Buf)/sizeof(QUEUE_DATA_TYPE)是结构体的长度。 好像这个MaxData 最大64K,不知道要不要做超出判断处理
页:
[1]