[小贴士]初始化任意对象的方法--该文有几处似乎不妥
刚刚看了傻孩子同学的这篇文章,有如下几处似有进一步商榷之必要。1.
/***********************************************************
* 函数说明:对象初始化函数(小) *
* 输入: 对象指针,对象大小 *
* 输出: 对象指针 *
* 调用函数:无 *
***********************************************************/
void *Small_Object_Initial(void *pData,UINT8 chLength)
{
if ((pData == NULL) || (chLength == 0))
{
return NULL;
}
{
UINT8 chCounter = 0;
for (chCounter = 0;chCounter < chLength;chCounter++)
{
((BYTE *)pData) = 0;
}
}
return pData;
}
---------------------------
该函数的参数pData为void*指针,而函数体确为BYTE *指针。如有如下调用:Small_Object_Initial((int *)pINT,N);即对N个(int*)pData初始化时时可能会发生错误。
2.
typedef struct DisplayDeviceInterface DDI;
struct DisplayDeviceInterface
{
DEVICE_ID_TYPE DeviceID; //设备ID BIT15用于区别设备是否为虚拟设备
UINT32 dwDeviceAddress; //设备地址
UINT32 dwDeviceSize; //设备允许的区域大小
DDI_RESET fnReset;
DDI_WRITE fnWriteByte;
DDI_READ fnReadByte;
DDI_WRITE_STREAM fnWriteStream;
DDI_READ_STREAM fnReadStream;
DDI_SET_ADDRESS fnSetAddress;
DDI_CLS fnCLS;
};
---------------------
typedef之时,编译器并不晓得有个struct DisplayDeviceInterface ,因此会产生编译错误。应该将该句放在struct DisplayDeviceInterface 定义之后。 楼主,对以上两个情况,我解释一下。
首先void *作为指针,意味着我可以传递任何类型的地址。但是我统一按照字节为单位
进行初始化的。因此,第二个参数chLength应该是要初始化对象的字节数,而不是数组
的最大范围。所以要对n个INT变量初始化时,应该是sizeof(int) * n个字节。
通常,一个对象都是可以用typedef来定义成自定义类型的,使用sizeof()测出类型大小
以后再传递给参数就可以了。
第二个问题,不知楼主测试过没有,是没有问题的。这个叫做超前引用。 为什么不用memset(),c标准库里的,一般编译器都会实现,理论上说编译器自己实现的效率最高。
第二个问题我没试,但有种写法struct xxxxx *,你可以在不定义结构体xxxxx的时候,就定义指向该结构体的指针。
有人称为不透明类型,楼主可以google"不透明类型"。 to 【2楼】 zllfdd
memset描述大小的是int变量,而我对常见的256字节以内的用char变量做计数器。理论上在循环时,可以节省一点周期数。 【3楼】 Gorgon Meducer 傻孩子
这个没想到,呵呵。 学问之美,在于让人一头雾水啊!:) 【2楼】 zllfdd
我也是洛阳的,有空向你请教,如何和你联系? 楼上的,我现在在郑州,有问题可以发_论坛上,大家一起讨论比较好。
如果你想私下聊,可以用email,我的是 zllfdd at 163.com
QQ号就不留了,我正打算慢慢的远离这个东西。
页:
[1]