尽量用库函数

来源:互联网 发布:发论文数据可以造假吗 编辑:程序博客网 时间:2024/05/22 11:42

 文件:shark/src/dvbc/drivers/data/data.c
函数:Get_FactotyID
版本:1.28

#define FactoryID_addr 0x40002040
#define FactoryID_length 17

int Get_FactotyID(void)
{
         int ercode = 0;
         ITI_BYTE FactoryID[FactoryID_length];
         int number=0,i=0;
        ercode = cfsFileRead(FactoryID_addr, (void *)FactoryID, FactoryID_length);
        if(ercode == 0)
                for(i=10;i<FactoryID_length;i++)
                        {
                                if((FactoryID_length-i-1)>0)
                                        {
                                        number += (int)(FactoryID[ i ] - '0');
                                        number *= 10;
                                        }
                                else
                                        number += (int)(FactoryID[ i ] - '0');
                                //printf( "Get_FactotyID =%d,FactoryID[ i ]=%d/n",number,FactoryID[ i ]);
                        }
        else
                number = 2701;
        return number;
}

/////// step0: 合并重复的代码
for(i=10;i<FactoryID_length;i++)
    {
    number += (int)(FactoryID[ i ] - '0');

    if((FactoryID_length-i-1)>0)
        number *= 10;
    }

/////// step1: 去除不需要的判断
for(i=10;i<FactoryID_length;i++)
    {
    number *= 10;
    number += (int)(FactoryID[ i ] - '0');
    }

/////// step2: 尽量用库函数
number = strtoul(&FactoryID[10], NULL, 10);
由于FactoryID不能保证有结束符,所以这样改引入了一个bug。

/////// 最终修改
ITI_BYTE FactoryID[FactoryID_length+1];
FactoryID[FactoryID_length] = '/0';
number = strtoul(&FactoryID[10], NULL, 10);
或者用strtol, strtoull, atoi, atol, atoll来代替

总结:
如果已有相同功能的函数:
尽量用标准的C库,而不是自己写代码;既可最大限度的保证代码的正确性,又能节约开发时间。
尽量用本公司已有的函数、库,可进一步验证他们,以提高本公司的软件质量。
尽量让自己的模块的函数标准化,library化。提高其移植性,重用度。移植性越高,重用的地方越多;重用的地方越多,软件验证的机会就越多;验证的机会就越多,发现bug越快,可靠性越高,可信度越高,自然用的就越多。如此形成良性循环。


额外:
为什么要在函数开始时对变量ercode,i赋值?

原创粉丝点击