C编程规范, 示例代码。

/***************************************************************
*Copyright (c) 2014,TianYuan
*All rights reserved.
*
*文件名称: standard.h
*文件标识: 编程规范示例代码
*
*当前版本:V1.0
*作者:wuyq
*完成日期:20140709
*
*修改记录1:   //修改历史记录,包括修改日期、版本号、修改人及修改内容等
*修改日期        版本号              修改人         修改内容
* --------------------------------------------------------------------------------------------------
* 20140709         V1.0                wuyq            创建
******************************************************************/

#ifndef _STANDARD_H__
#define _STANDARD_H__

/*重定义一些基本数据类型*/
typedef char                s8;
typedef unsigned char       u8;
typedef signed short        s16;
typedef unsigned short      u16;
typedef int                 s32;
typedef unsigned int	    u32;
typedef float               f32;
typedef signed long long    s64;
typedef unsigned long long  u64;
typedef enum {FALSE =0, TRUE =!FALSE} bool;
typedef bool BOOL;

/* 消息头 */
typedef struct {
    u16     u16MsgType;         /* 消息类型*/
    u16     u16MsgLength;       /*有效消息数据长度*/
    u8      u8TransType;		/*传输通道0:网络 1:串口*/
    u8      u8Reserved[3];		/*对齐*/
}STRU_MSG_HEAD;

/* 时间信息*/
typedef struct {
    u16     u16Year;	/*年*/
    u16     u16Month;	/*月*/
    u8      u8Day;		/*日*/
    u8      u8Hour;		/*时*/
    u8      u8Minute;	/*分*/
    u8      u8Second;	/*秒*/
}STRU_TIME_INFO;

/* MCM->Main 查询系统信息*/
struct  stru_machine_info_req {
    STRU_MSG_HEAD   struMsgHeader;/*消息头*/
};

/* Main->MCM 反馈系统信息*/
struct stru_machine_info_rsp {
    STRU_MSG_HEAD   struMsgHeader;/*消息头*/
    f32             f32Temp;/*当前采样温度*/
    f32             f32Vol;/*当前采样电压*/
    f32             f32CpuFreq;/*Cpu频率*/
    u32             u32FreeMem;/*剩余内存*/
    u32             u32FreeDisk;/*剩余FLASH空间*/
};
/* Main向MCM返回软件升级结果 */
struct stru_software_update_rsp {
    STRU_MSG_HEAD   struMsgHeader;
    u8              b8Successful;/*是否升级成功*/
    u8              u8Reserved[3];/*字对齐,保留*/
};

//函数头部的可采用如下的样式
/**********************************************************************
 *功能描述:
 *输入参数:
 *输出参数:
 *返回值:
 *其它说明:
 *修改记录1:   //修改历史记录,包括修改日期、版本号、修改人及修改内容等
 *修改日期        版本号              修改人         修改内容
 * --------------------------------------------------------------------------------------------------
 * 20140709         V1.0                wuyq            创建
 ***********************************************************************/

#endif

/**********************************************************************
*Copyright (c) 2014,TianYuan
*All rights reserved.
*
* 文件名称: UnitTest.c
* 文件标识:无
* 内容摘要:协议及单元测试示例代码
* 其它说明:无
* 当前版本: V1.0
* 作    者: wuyq
* 完成日期: 20140709
*
*修改记录1:   //修改历史记录,包括修改日期、版本号、修改人及修改内容等
*修改日期        版本号              修改人         修改内容
* --------------------------------------------------------------------------------------------------
* 20140709         V1.0                wuyq            创建
**********************************************************************/
#include <stdio.h>
#include <string.h>

// 重定义数据类型
typedef unsigned char       UINT8;
typedef unsigned short int    UINT16;
typedef unsigned int        UINT32;
typedef signed   int        INT32;

// 消息头结构
typedef struct
{
    UINT16  iReserve1;
    UINT16  iReserve2;
    UINT16  iReserve3;
    UINT16  iReserve4;
}MsgHead_T;

// 消息结构体(包含消息头和消息体)
typedef struct
{
    MsgHead_T   MsgHead;                // 消息头
    UINT32      iOperType;      // 操作类型, 操作类型只能为1或2
    UINT8       szUserNumber[30];         // 用户号码
    UINT8       szOperTime[20];      // 操作时间, 格式为: yyyymmdd
    UINT32       iReserve1;                // 保留字段1
    UINT8        szReserve2[50];           // 保留字段2
}UserReqMsg_T;

// 函数声明
INT32 ProcUserReqMsg(UserReqMsg_T *ptUserReqMsg);
INT32 main();

/**********************************************************************
* 功能描述:主函数
* 输入参数:无
* 输出参数:无
* 返回值: 0-执行完毕
* 其它说明:无
* 修改日期        版本号              修改人         修改内容
* --------------------------------------------------------------------------------------------------
* 20140507         V1.0                zzx            创建
***********************************************************************/
INT32 main()
{
    UINT8  iRetVal          = 0;
    UINT32 iOperType        = 0;        // 操作类型
    UINT8  szUserNumber[30] = {0};      // 用户号码
    UINT8  szOperTime[10]  = {0};    // 操作时间, 格式为: yyyymmdd

    UserReqMsg_T tUserReqMsg = {0};     // 请求消息

    // 对消息头部进行赋值
    tUserReqMsg.MsgHead.iReserve1 = 1;
    tUserReqMsg.MsgHead.iReserve2 = 2;
    tUserReqMsg.MsgHead.iReserve3 = 3;
    tUserReqMsg.MsgHead.iReserve4 = 4;

    // 读入具体消息字段的值
    printf("操作类型: \n");
    scanf("%d", &iOperType);
    printf("用户号码: \n");
    scanf("%s", szUserNumber);
    printf("操作时间: \n");
    scanf("%s", szOperTime);

    // 对具体消息字段进行赋值(保留字段可不赋值)
    tUserReqMsg.iOperType = iOperType;
    strncpy(tUserReqMsg.szUserNumber, szUserNumber, strlen(szUserNumber));// 获取号码, 用strncpy代替strcpy
    strncpy(tUserReqMsg.szOperTime,   szOperTime,   strlen(szOperTime));     // 获取时间, 用strncpy代替strcpy

    // 对消息体的字段进行异常判断
    iRetVal = ProcUserReqMsg(&tUserReqMsg);  // 注意: 传递参数的时候要加上&
    if (iRetVal == 0)      // 函数执行正确
    {
        // 打印消息字段内容
        printf("The user request message is: iOperType=%d, szUserNumber=%s, szOperTime=%s.\n", tUserReqMsg.iOperType, tUserReqMsg.szUserNumber, tUserReqMsg.szOperTime);
        return 0;
    }
    else         // 打印异常消息
    {
        printf("Some content of the user request message is wrong, please check!\n");
        return -1;
    }
}

/**********************************************************************
* 功能描述:对消息体的字段进行异常判断
* 输入参数: ptUserReqMsg-用户请求消息
* 输出参数:无
* 返回值: 0-成功   其它-失败
* 其它说明:无
* 修改日期        版本号              修改人         修改内容
* --------------------------------------------------------------------------------------------------
* 20140507         V1.0                zzx            创建
***********************************************************************/
INT32 ProcUserReqMsg(UserReqMsg_T *ptUserReqMsg)
{
    INT32  iRetValue      = 0;

    // 对输入参数进行异常判断
    if (ptUserReqMsg == NULL)
    {
        printf("ProcUserReqMsg(...): input parameter(ptUserReqMsg) is NULL.\n");
        return -1;
    }

    // 对消息体字段进行异常判断
    if ((ptUserReqMsg->iOperType != 1) && (ptUserReqMsg->iOperType != 2))    // 操作类型只能为1或2, 其它为数据异常
    {
        printf("ProcUserReqMsg(...): the iOperType is wrong, iOperType=%d.\n", ptUserReqMsg->iOperType);
        return -2;
    }

    if (strlen(ptUserReqMsg->szUserNumber) != 8) // 用户号码异常, 长度8位才正确
    {
        printf("ProcUserReqMsg(...): the szUserNumber is wrong.\n");
        return -3;
    }

    if (strlen(ptUserReqMsg->szOperTime) != 8)  // 操作时间异常, 长度8位才正确
    {
        printf("ProcUserReqMsg(...): the szOperTime is wrong.\n");
        return -4;
    }

    return 0;
}
时间: 2024-08-25 02:17:04

C编程规范, 示例代码。的相关文章

JAVA 编程规范

编程|规范 1. 应用范围 本规范应用于采用J2EE规范的项目中,所有项目中的JAVA代码(含JSP,SERVLET,JAVABEAN,EJB)均应遵守这个规范.同时,也可作为其它项目的参考. 2. 设计类和方法 2.1 创建具有很强内聚力的类 方法的重要性往往比类的重要性更容易理解,方法是指执行一个统一函数的一段代码.类常被错误的视为是一个仅仅用于存放方法的容器.有些开发人员甚至把这种思路作了进一步的发挥,将他们的所有方法放入单个类之中. 之所以不能正确的认识类的功能,原因之一是类的实现实际上

Visual Basic编程规范

visual|编程|规范 Visual Basic编程规范 1.      Visual Basic IDE(集成开发环境)设置        必须打开设置选项的"要求变量声明","对齐控件到网格","自动缩进"开关.        Tab的宽度统一为4个空格,网格单位一律设为:width 60 height 60. 2.     命名约定        (注意:在任何时候,不能使用中文及全角字符,只允许使用英文字母.下划线和数字) 2.1   

《C++编程规范:101条规则、准则与最佳实践》——第2章设计风格设计风格 C++编程规范:101条规则、准则与最佳实践 复杂性啊,愚人对你视而不见,实干家受你所累。 有些人避而远之。惟智者能够善加消除。 ——Alan Perlis 我知道,但是却又忘记了Hoare的至理名言:不成熟的优化是程

第2章设计风格 C++编程规范:101条规则.准则与最佳实践 复杂性啊,愚人对你视而不见,实干家受你所累. 有些人避而远之.惟智者能够善加消除. --Alan Perlis 我知道,但是却又忘记了Hoare的至理名言:不成熟的优化是程序设计中的万恶之源. --Donald Knuth[1] The Errors of TeX[Knuth89] 完全区分设计风格与编码风格是非常困难的.我们将一般在实际编写代码时才用得到的条款留到下一部分介绍. 本部分集中讨论适用面比一个特定的类或者函数更广的原则和

写给大家看的编程规范

(本文参加 2014 CSDN博文大赛,谢谢.) [文章摘要]        "没有规矩,不成方圆",在实际的软件开发项目中,做任何事情都不是随心所欲的,我们编写代码需要遵守项目组约定的编程规范.很遗憾,在学校的计算机课程中,重在教导学生实现一定的程序功能,对程序的编写规范很少提及,这也就导致了从学校毕业踏上工作岗位之后一段艰辛的学习过程.        本文根据自身的软件开发实践,对实际的软件开发项目中编写C语言和SQL语言程序时所需遵守的规范进行了详细的介绍,旨在让广大即将从事软件

《C++编程规范:101条规则、准则与最佳实践》——第一章组织和策略问题1.1不要拘泥于小节 (又名:了解哪些东西不应该标准化)

第一章组织和策略问题 C++编程规范:101条规则.准则与最佳实践如果人们按照程序员编程的方式修建房屋,那么一只啄木鸟就能毁灭整个文明. --Gerald Weinberg[1] 为了遵从C和C++的伟大传统,我们从0开始编号.首要的指导原则,也就是第0条,阐明了我们认为对编程规范而言最为基本的建议. 接下来,这个导论性部分的其他条款将主要讲述几个精心选择的基本问题,这些问题大多数与代码本身并没有直接关系,它们讨论的是编写坚实代码所必需的工具和技术. 本部分中我们选出的最有价值条款是第0条:"不

php使用socket编程的示例

 这篇文章主要介绍了php使用socket编程的示例,大家参考使用吧 2个php测试文件 server.php     代码如下: <?php //phpinfo(); //确保在连接客户端时不会超时 set_time_limit(0);   $ip = '127.0.0.1'; $port = 1935;   /*  +-------------------------------  *    @socket通信整个过程  +-------------------------------  *

实现高效Java编程规范的十一条基础规则

编程|规范 本文介绍的Java规则的说明分为5个级别,级别1是最基本也是最重要的级别,在今后将陆续写出其他的规则.遵守了这些规则可以提高程序的效率.使代码有更好的可读性等. (1) 避免使用NEW关键字来创建String对象 把一个String常量copy到String 对象中通常是多余.浪费时间的. Public class test{ Public void method(){ System.out.print (str); } private String str = new String

C#编程规范和惯例

编程|规范 谁都会写代码!几个月的编程经验可以让你写出"可运行应用程序".让它可运行容易,但是以最有效率的方式编码就需要下更多的功夫! 要知道,大多数程序员在写"可运行代码,"而不是"高效代码".我们在这个指南课程前面提到,你想成为你们公司"最尊贵的专业人员"吗?写"高效代码"是一项艺术,你必须学习和实践它. 命名惯例和规范 注记 : Pascal 大小写形式-所有单词第一个字母大写,其他字母小写.Came

Asp.net 2.0 制作最原始的TextBox控件[一](示例代码下载)

asp.net|控件|示例|下载 (一). 概述         示例制作一个与Asp.net TextBox同样功能的 TextBox control, 可以了解一下        Control底层的实现原理(二). 代码实现      1. 核心控件生成代码文件TextBox.cs  1  1using System; 2  2using System.Data; 3  3using System.Configuration; 4  4using System.Web; 5  5using