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;
}
C编程规范, 演示样例代码。的更多相关文章
- java 线程、线程池基本应用演示样例代码回想
java 线程.线程池基本应用演示样例代码回想 package org.rui.thread; /** * 定义任务 * * @author lenovo * */ public class Lift ...
- java文件夹相关操作 演示样例代码
java文件夹相关操作 演示样例代码 package org.rui.io; import java.io.File; import java.io.FilenameFilter; import ja ...
- 10分钟理解Android数据库的创建与使用(附具体解释和演示样例代码)
1.Android数据库简单介绍. Android系统的framework层集成了Sqlite3数据库.我们知道Sqlite3是一种轻量级的高效存储的数据库. Sqlite数据库具有以下长处: (1) ...
- java 又一次抛出异常 相关处理结果演示样例代码
java 又一次抛出异常 相关处理结果演示样例代码 package org.rui.ExceptionTest; /** * 又一次抛出异常 * 在某些情况下,我们想又一次掷出刚才产生过的违例,特别是 ...
- java I/O进程控制,重定向 演示样例代码
java I/O进程控制,重定向 演示样例代码 package org.rui.io.util; import java.io.*; /** * 标准I/O重定向 */ public class Re ...
- [Python] SQLBuilder 演示样例代码
用Python写一个SQLBuilder.Java版能够从 http://www.java2s.com/Code/Java/Database-SQL-JDBC/SQLBuilder.htm 看到. 附 ...
- AppCan移动应用开发平台新增9个超有用插件(内含演示样例代码)
使用AppCan平台进行移动开发.你所须要具备的是Html5+CSS +JS前端语言基础.此外.Hybrid混合模式应用还需结合原生语言对功能模块进行封装,对于没有原生基础的开发人员,怎样实现App里 ...
- Linux下用OTL操作MySql(包含自己封装的类库及演示样例代码下载)
版权声明:本文为博主原创文章,未经博主同意不得转载. https://blog.csdn.net/ClamReason/article/details/23971805 首先重点推荐介绍otl介绍及使 ...
- java 状态模式 解说演示样例代码
package org.rui.pattern; import junit.framework.*; /** * 为了使同一个方法调用能够产生不同的行为,State 模式在代理(surrogate)的 ...
随机推荐
- mybatis-generator 动态生成实体对象、dao 以及相关的xml映射文件
.新建maven空项目 2.修改pom.xml文件 <?xml version="1.0" encoding="UTF-8"?> <proje ...
- 02:奇数单增序列 个人博客doubleq.win
个人博客doubleq.win 02:奇数单增序列 查看 提交 统计 提问 总时间限制: 1000ms 内存限制: 65536kB 描述 给定一个长度为N(不大于500)的正整数序列,请将其中的所 ...
- 使用postMessage通信,未触发message事件
前提: 父子页面跨域通信,使用postMessage技术 a页面为父页面,b页面为子页面 a中包含多个iframe,部分域名是相同的,目录层级不一致,地址使用变量根据触发的条件不同拼接地址 部分代码( ...
- WinForm实现Rabbitmq官网6个案例-RPC
获取源码 客户端代码: namespace RabbitMQDemo { public partial class RPC : Form { private readonly static RPC _ ...
- 转:centos7.2安装jdk1.6和/etc/profile不生效问题
转:centos7.2安装jdk1.6和/etc/profile不生效问题 转自:http://blog.csdn.net/cuker919/article/details/54178611 一.查看 ...
- 一步一步pwn路由器之路由器环境修复&&rop技术分析
前言 本文由 本人 首发于 先知安全技术社区: https://xianzhi.aliyun.com/forum/user/5274 拿到路由器的固件后,第一时间肯定是去运行目标程序,一般是web服务 ...
- python oop常用术语 继承 多态 封装
面向对象优点 1.通过封装明确了内外 2.通过继承+多态在语言层面支持了归一化设计 抽象/实现 抽象指对现实世界问题和实体的本质表现,行为和特征建模,建立一个相关的子集,可以用于 绘程序结构,从而实现 ...
- 加装固态硬盘SSD
参考:http://tieba.baidu.com/p/4224078869 1.首先拆开后盖,取出机械硬盘,把固定框换到固态盘上,把机械盘安装到硬盘托架上. 装上固态硬盘,然后把光驱位的塑料壳子拆下 ...
- python之路——进程
操作系统背景知识 顾名思义,进程即正在执行的一个过程.进程是对正在运行程序的一个抽象. 进程的概念起源于操作系统,是操作系统最核心的概念,也是操作系统提供的最古老也是最重要的抽象概念之一.操作系统的其 ...
- python之路——网络基础
你现在已经学会了写python代码,假如你写了两个python文件a.py和b.py,分别去运行,你就会发现,这两个python的文件分别运行的很好.但是如果这两个程序之间想要传递一个数据,你要怎么做 ...