搜索
bottom↓
回复: 7

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

[复制链接]

出0入0汤圆

发表于 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)[chCounter] = 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   定义之后。

出0入296汤圆

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

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

出0入0汤圆

发表于 2008-6-23 19:10:27 | 显示全部楼层
为什么不用memset(),c标准库里的,一般编译器都会实现,理论上说编译器自己实现的效率最高。

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

出0入296汤圆

发表于 2008-6-23 19:39:17 | 显示全部楼层
to 【2楼】 zllfdd
    memset描述大小的是int变量,而我对常见的256字节以内的用char变量做计数器。理论上在循环时,可以节省一点周期数。

出0入0汤圆

发表于 2008-6-23 19:52:10 | 显示全部楼层
【3楼】 Gorgon Meducer 傻孩子

这个没想到,呵呵。

出0入0汤圆

发表于 2008-6-23 23:49:11 | 显示全部楼层
学问之美,在于让人一头雾水啊!:)

出0入0汤圆

发表于 2008-6-26 09:47:03 | 显示全部楼层
【2楼】 zllfdd
我也是洛阳的,有空向你请教,如何和你联系?

出0入0汤圆

发表于 2008-6-26 12:40:18 | 显示全部楼层
楼上的,我现在在郑州,有问题可以发_论坛上,大家一起讨论比较好。
如果你想私下聊,可以用email,我的是 zllfdd at 163.com
QQ号就不留了,我正打算慢慢的远离这个东西。
回帖提示: 反政府言论将被立即封锁ID 在按“提交”前,请自问一下:我这样表达会给举报吗,会给自己惹麻烦吗? 另外:尽量不要使用Mark、顶等没有意义的回复。不得大量使用大字体和彩色字。【本论坛不允许直接上传手机拍摄图片,浪费大家下载带宽和论坛服务器空间,请压缩后(图片小于1兆)才上传。压缩方法可以在微信里面发给自己(不要勾选“原图),然后下载,就能得到压缩后的图片】。另外,手机版只能上传图片,要上传附件需要切换到电脑版(不需要使用电脑,手机上切换到电脑版就行,页面底部)。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

手机版|Archiver|amobbs.com 阿莫电子技术论坛 ( 粤ICP备2022115958号, 版权所有:东莞阿莫电子贸易商行 创办于2004年 (公安交互式论坛备案:44190002001997 ) )

GMT+8, 2024-5-9 06:15

© Since 2004 www.amobbs.com, 原www.ourdev.cn, 原www.ouravr.com

快速回复 返回顶部 返回列表