#ifndef __ORDER_H__ #define __ORDER_H__ #include <stdio.h> #include <ctype.h> #include <stdlib.h> #include <string.h> //#define U32 (unsigned int) #define Mes_SIZE 256//数组元素的个数 #define Com_SIZE 20//存储命令的数组长度 char MesBuff[Mes_SIZE];//全局数组接收应答消息 char MESBuff[Mes_SIZE];//汇总之后消息的存储数组 int len=0;//全局变量记录指针移动长度 int flag=0;//全局变量记录函数返回状态 /*****************************************************************************************/ /* 应答命令格式 */ /*****************************************************************************************/ #define Ord_Head "$"//命令头起始符 #define Ord_Tail ":"//命令头结束符 #define Ord_Dec ","//流水号和应答码之间的, #define Ord_End "\r\n"//应答结束符 #define RES_C_WEAKUP "A_WEAKUP"//唤醒应答 /*****************************************************************************************/ /* 应答命令状态 */ /*****************************************************************************************/ /*通用应答返回值*/ #define SUCCESS 0//执行成功 /*固定参数*/ typedef struct Fixed_Param{ char RES_Ans_Serial[20];//流水号 char RES_Ans_Num;//应答码 }FIXED_PARAM; #endif // 这是头文件,定义了宏全局数组和结构体 #include "Order.h" int RES_Message_O_Handle(char* Order,char* Serial,char* Key_Serial,char* ptr)//消息解析函数 { sscanf(ptr,"%*c%[A-Z_]s",Order); sscanf(ptr,"%*[^:]:%[^,]", Serial); sscanf(ptr,"%*[^,],%[^\]",Key_Serial); return SUCCESS; } int RES_Message_I_Handle(char* Mes_Order,char* Mes_Serial,char* Mes_Key_Serial,char* Message)//消息整合函数 { len=0;//初始化len memset(MesBuff,0,sizeof(MesBuff));//初始化全局数组 Message=MesBuff; memcpy(Message,Ord_Head,sizeof(Ord_Head)); len+=sizeof(Ord_Head)-1; memcpy(Message+len,RES_C_WEAKUP,strlen(RES_C_WEAKUP));///////////////////这里怎么用指针把宏的值传过来?//////////////////// len+=sizeof(RES_C_WEAKUP)-1; memcpy(Message+len,Ord_Tail,sizeof(Ord_Tail)); len+=sizeof(Ord_Tail)-1; memcpy(Message+len,Mes_Serial,sizeof(Mes_Serial)); len+=sizeof(Mes_Serial); memcpy(Message+len,Ord_Dec,sizeof(Ord_Dec)); len+=sizeof(Ord_Dec); memcpy(Message+len,Mes_Key_Serial,sizeof(Mes_Key_Serial));/////////这个地方Mes_Key_Serial的值拼接不上 len+=sizeof(Mes_Key_Serial); memcpy(Message+len,Ord_End,sizeof(Ord_End)); printf("%s\n",Message);//////////////////这里输出$A_WEAKUP:0002,后面就没有了。 return SUCCESS; } int RES_C_Weakup(char* RES_Serial,char* c)//设备唤醒应答函数 { memset(MESBuff,0,sizeof(MESBuff));//初始化全局数组 //char* Order_Buff=RES_C_WEAKUP; FIXED_PARAM fixed_param; fixed_param.RES_Ans_Num=""1""; RES_Message_I_Handle(RES_C_WEAKUP,RES_Serial,&fixed_param.RES_Ans_Num,MESBuff); c=MESBuff; printf("%s\n",MESBuff); return SUCCESS; } int main() { char Order_Buff[Com_SIZE]; char Serial_Buff[Com_SIZE]; char Key_Serial_Buff[Com_SIZE]; char* ptr="$C_ENGINSTART:0002,0102030405060708\r\n"; RES_Message_O_Handle(Order_Buff,Serial_Buff,Key_Serial_Buff,ptr); printf("The Order is:%s\n",Order_Buff); printf("The Serial is:%s\n",Serial_Buff); printf("The KeySerial is:%s\n",Key_Serial_Buff); char BUFF[256]; memset(BUFF,0,sizeof(char)*256); RES_C_Weakup(Serial_Buff,BUFF); fflush(stdout); printf("\nThis message is:%s\n",BUFF); system("pause"); return SUCCESS; } 这是.c文件,主要做消息的解析和封装。 小弟有两个问题:1.如何通过指针传递宏定义的字符串内容? |
|
崩溃的时候在弹出的对话框按相应按钮进入调试,按Alt+7键查看Call Stack即“调用堆栈”里面从上到下列出的对应从里层到外层的函数调用历史。双击某一行可将光标定位到此次调用的源代码或汇编指令处,看不懂时双击下一行,直到能看懂为止。
|
|
VC编译选项加/EP /P,重新编译,查看宏展开后对应的.i文件。gcc加-E http://bbs.csdn.net/topics/391003898
|
|
5分 |
宏定义,直接使用,不需要传递
|
#define RES_C_WEAKUP "A_WEAKUP"//唤醒应答 #define RES_C_ENGINSTART "A_ENGINSTART"//启动应答 #define RES_C_OPENLOCK "A_OPENLOCK"//遥控开锁应答 #define RES_C_CLOSELOCK "A_CLOSELOCK"//锁门应答 /*....................*/ 因为有很多宏,每一个应答命令要写一个函数来实现消息的拼接。所以我想写一个共通函数,让每一个命令函数调用它 |
|
我自己搞不定啊 赵四老师 |
|
10分 |
///Order.h #ifndef __ORDER_H__ #define __ORDER_H__ #include <stdio.h> #include <ctype.h> #include <stdlib.h> #include <string.h> //#define U32 (unsigned int) #define Mes_SIZE 256//数组元素的个数 #define Com_SIZE 20//存储命令的数组长度 char MesBuff[Mes_SIZE];//全局数组接收应答消息 char MESBuff[Mes_SIZE];//汇总之后消息的存储数组 int len=0;//全局变量记录指针移动长度 int flag=0;//全局变量记录函数返回状态 /*****************************************************************************************/ /* 应答命令格式 */ /*****************************************************************************************/ #define Ord_Head "$"//命令头起始符 #define Ord_Tail ":"//命令头结束符 #define Ord_Dec ","//流水号和应答码之间的, #define Ord_End "\r\n"//应答结束符 enum RES_C_FUNCS { RES_C_WEAKUP,//0 RES_C_ENGINSTART,//1 RES_C_OPENLOCK,//2 RES_C_CLOSELOCK,//3 }; const char *RES_C_FUNC2STR[4]={ "A_WEAKUP",//唤醒应答 "A_ENGINSTART",//启动应答 "A_OPENLOCK",//遥控开锁应答 "A_CLOSELOCK",//锁门应答 }; /*....................*/ /*****************************************************************************************/ /* 应答命令状态 */ /*****************************************************************************************/ /*通用应答返回值*/ #define SUCCESS 0//执行成功 /*固定参数*/ typedef struct Fixed_Param{ char RES_Ans_Serial[20];//流水号 char RES_Ans_Num;//应答码 }FIXED_PARAM; #endif // ///Order.cpp #include "Order.h" int RES_Message_O_Handle(char* Order,char* Serial,char* Key_Serial,char* ptr)//消息解析函数 { sscanf(ptr,"%*c%[A-Z_]s",Order); sscanf(ptr,"%*[^:]:%[^,]", Serial); sscanf(ptr,"%*[^,],%[^\]",Key_Serial); return SUCCESS; } int RES_Message_I_Handle(char* Mes_Order,char* Mes_Serial,char* Mes_Key_Serial,char* Message)//消息整合函数 { len=0;//初始化len memset(MesBuff,0,sizeof(MesBuff));//初始化全局数组 Message=MesBuff; memcpy(Message,Ord_Head,strlen(Ord_Head)); len+=strlen(Ord_Head); memcpy(Message+len,RES_C_FUNC2STR(RES_C_WEAKUP),strlen(RES_C_FUNC2STR(RES_C_WEAKUP))); len+=strlen(RES_C_FUNC2STR(RES_C_WEAKUP)); memcpy(Message+len,Ord_Tail,strlen(Ord_Tail)); len+=strlen(Ord_Tail); memcpy(Message+len,Mes_Serial,strlen(Mes_Serial)); len+=strlen(Mes_Serial); memcpy(Message+len,Ord_Dec,strlen(Ord_Dec)); len+=strlen(Ord_Dec); memcpy(Message+len,Mes_Key_Serial,strlen(Mes_Key_Serial));/////////这个地方Mes_Key_Serial的值拼接不上 len+=strlen(Mes_Key_Serial); memcpy(Message+len,Ord_End,strlen(Ord_End)); printf("%s\n",Message);//////////////////这里输出$A_WEAKUP:0002,后面就没有了。 return SUCCESS; } int RES_C_Weakup(char* RES_Serial,char* c)//设备唤醒应答函数 { memset(MESBuff,0,sizeof(MESBuff));//初始化全局数组 //char* Order_Buff=RES_C_WEAKUP; FIXED_PARAM fixed_param; fixed_param.RES_Ans_Num=""1""; RES_Message_I_Handle(RES_C_FUNC2STR(RES_C_WEAKUP),RES_Serial,&fixed_param.RES_Ans_Num,MESBuff); c=MESBuff; printf("%s\n",MESBuff); return SUCCESS; } int main() { char Order_Buff[Com_SIZE]; char Serial_Buff[Com_SIZE]; char Key_Serial_Buff[Com_SIZE]; char* ptr="$C_ENGINSTART:0002,0102030405060708\r\n"; RES_Message_O_Handle(Order_Buff,Serial_Buff,Key_Serial_Buff,ptr); printf("The Order is:%s\n",Order_Buff); printf("The Serial is:%s\n",Serial_Buff); printf("The KeySerial is:%s\n",Key_Serial_Buff); char BUFF[256]; memset(BUFF,0,sizeof(char)*256); RES_C_Weakup(Serial_Buff,BUFF); fflush(stdout); printf("\nThis message is:%s\n",BUFF); system("pause"); return SUCCESS; } |
5分 |
注意修改了楼上对应函数的代码:
int RES_Message_I_Handle(char* Mes_Order,char* Mes_Serial,char* Mes_Key_Serial,char* Message)//消息整合函数 { len=0;//初始化len memset(MesBuff,0,sizeof(MesBuff));//初始化全局数组 Message=MesBuff; memcpy(Message,Ord_Head,strlen(Ord_Head)); len+=strlen(Ord_Head); memcpy(Message+len,RES_C_FUNC2STR(RES_C_WEAKUP),strlen(RES_C_FUNC2STR(RES_C_WEAKUP))); len+=strlen(RES_C_FUNC2STR(RES_C_WEAKUP)); memcpy(Message+len,Ord_Tail,strlen(Ord_Tail)); len+=strlen(Ord_Tail); memcpy(Message+len,Mes_Serial,strlen(Mes_Serial)); len+=strlen(Mes_Serial); memcpy(Message+len,Ord_Dec,strlen(Ord_Dec)); len+=strlen(Ord_Dec); memcpy(Message+len,Mes_Key_Serial,1); len+=1; memcpy(Message+len,Ord_End,strlen(Ord_End)); printf("%s\n",Message); return SUCCESS; } |
5分 |
看起来是把求字符串长度用成了sizeof, 应该是strlen的
|
15分 |
代码写成这副德行,真是无语!
#include <stdio.h> #include <ctype.h> #include <stdlib.h> #include <string.h> #define Mes_SIZE 256 // 数组元素的个数 #define Com_SIZE 20 // 存储命令的数组长度 char MesBuff[Mes_SIZE]; // 全局数组接收应答消息 char MESBuff[Mes_SIZE]; // 汇总之后消息的存储数组 int len = 0; // 全局变量记录指针移动长度 int flag = 0; // 全局变量记录函数返回状态 /*****************************************************************************************/ /* 应答命令格式 */ /*****************************************************************************************/ #define Ord_Head "$" // 命令头起始符 #define Ord_Tail ":" // 命令头结束符 #define Ord_Dec "," // 流水号和应答码之间的, #define Ord_End "\r\n" // 应答结束符 #define RES_C_WEAKUP "A_WEAKUP" // 唤醒应答 /*****************************************************************************************/ /* 应答命令状态 */ /*****************************************************************************************/ /*通用应答返回值*/ #define SUCCESS 0 // 执行成功 /*固定参数*/ typedef struct Fixed_Param{ char RES_Ans_Serial[20]; // 流水号 char RES_Ans_Num; // 应答码 }FIXED_PARAM; int RES_Message_O_Handle (char* Order, char* Serial, char* Key_Serial, char* ptr)//消息解析函数 { sscanf(ptr,"%*c%[A-Z_]s",Order); // "C_ENGINSTART" sscanf(ptr,"%*[^:]:%[^,]",Serial); // "0002" sscanf(ptr,"%*[^,],%[^\]",Key_Serial); // "0102030405060708" return SUCCESS; } int RES_Message_I_Handle (char* Mes_Order, char* Mes_Serial, char* Mes_Key_Serial, char* Message)//消息整合函数 { len=0;//初始化len memcpy(Message,Ord_Head,sizeof(Ord_Head)); len+=sizeof(Ord_Head)-1; memcpy(Message+len,RES_C_WEAKUP,strlen(RES_C_WEAKUP));///////////////////这里怎么用指针把宏的值传过来?//////////////////// len+=sizeof(RES_C_WEAKUP)-1; memcpy(Message+len,Ord_Tail,sizeof(Ord_Tail)); len+=sizeof(Ord_Tail)-1; memcpy(Message+len,Mes_Serial,strlen (Mes_Serial)); len+=strlen(Mes_Serial); memcpy(Message+len,Ord_Dec,sizeof(Ord_Dec)); len+=sizeof(Ord_Dec)-1; memcpy(Message+len,Mes_Key_Serial,sizeof(*Mes_Key_Serial));/////////这个地方Mes_Key_Serial的值拼接不上 len+=sizeof(*Mes_Key_Serial); memcpy(Message+len,Ord_End,sizeof(Ord_End)); printf("RES_Message_I_Handle[%s]\n",Message);//////////////////这里输出$A_WEAKUP:0002,后面就没有了。 return SUCCESS; } int RES_C_Weakup(char* RES_Serial,char* c)//设备唤醒应答函数 { //char* Order_Buff=RES_C_WEAKUP; FIXED_PARAM fixed_param; fixed_param.RES_Ans_Num=""1""; memset(MESBuff,0,sizeof(MESBuff));//初始化全局数组 RES_Message_I_Handle(RES_C_WEAKUP,RES_Serial,&fixed_param.RES_Ans_Num,MESBuff); strcpy (c, MESBuff); printf("RES_C_Weakup[%s]\n",MESBuff); return SUCCESS; } int main() { char Order_Buff[Com_SIZE] = {0}; char Serial_Buff[Com_SIZE] = {0}; char Key_Serial_Buff[Com_SIZE] = {0}; char BUFF[256]; char* ptr="$C_ENGINSTART:0002,0102030405060708\r\n"; RES_Message_O_Handle(Order_Buff,Serial_Buff,Key_Serial_Buff,ptr); printf("The Order is:%s\n",Order_Buff); printf("The Serial is:%s\n",Serial_Buff); printf("The KeySerial is:%s\n",Key_Serial_Buff); memset(BUFF,0,sizeof(char)*256); RES_C_Weakup(Serial_Buff,BUFF); fflush(stdout); printf("This message is:[%s]\n",BUFF); system("pause"); return SUCCESS; } |
谢谢您,我的C语言水平实在太差,正在努力中。我会把您指出的错误好好整理,并养成一个好的代码书写规范。 |
|
哎,谢谢了。C语言水平太烂了。 |
|
多谢赵四老师指出的错误并且给出了方法。虽然跑起来有点问题,不过我会自己搞定。我先好好研究一下。 |