minshg 发表于 2008-6-23 15:24:54

[小贴士]初始化任意对象的方法--该文有几处似乎不妥

刚刚看了傻孩子同学的这篇文章,有如下几处似有进一步商榷之必要。
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   定义之后。

Gorgon_Meducer 发表于 2008-6-23 16:09:51

楼主,对以上两个情况,我解释一下。
首先void *作为指针,意味着我可以传递任何类型的地址。但是我统一按照字节为单位
进行初始化的。因此,第二个参数chLength应该是要初始化对象的字节数,而不是数组
的最大范围。所以要对n个INT变量初始化时,应该是sizeof(int) * n个字节。
通常,一个对象都是可以用typedef来定义成自定义类型的,使用sizeof()测出类型大小
以后再传递给参数就可以了。

第二个问题,不知楼主测试过没有,是没有问题的。这个叫做超前引用。

zllfdd 发表于 2008-6-23 19:10:27

为什么不用memset(),c标准库里的,一般编译器都会实现,理论上说编译器自己实现的效率最高。

第二个问题我没试,但有种写法struct xxxxx *,你可以在不定义结构体xxxxx的时候,就定义指向该结构体的指针。
有人称为不透明类型,楼主可以google"不透明类型"。

Gorgon_Meducer 发表于 2008-6-23 19:39:17

to 【2楼】 zllfdd
    memset描述大小的是int变量,而我对常见的256字节以内的用char变量做计数器。理论上在循环时,可以节省一点周期数。

zllfdd 发表于 2008-6-23 19:52:10

【3楼】 Gorgon Meducer 傻孩子

这个没想到,呵呵。

hn_ny_dxs 发表于 2008-6-23 23:49:11

学问之美,在于让人一头雾水啊!:)

admvip 发表于 2008-6-26 09:47:03

【2楼】 zllfdd
我也是洛阳的,有空向你请教,如何和你联系?

zllfdd 发表于 2008-6-26 12:40:18

楼上的,我现在在郑州,有问题可以发_论坛上,大家一起讨论比较好。
如果你想私下聊,可以用email,我的是 zllfdd at 163.com
QQ号就不留了,我正打算慢慢的远离这个东西。
页: [1]
查看完整版本: [小贴士]初始化任意对象的方法--该文有几处似乎不妥