求高手!关于函数指针参数调用 字符串 宏的问题。 急 !!!

leee7338 2015-06-24 03:14:33

#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.如何通过指针传递宏定义的字符串内容?
2.为什么我的BUFF输出是空?我单步调试的时候是在这个函数中出的问题int RES_Message_I_Handle(char* Mes_Order,char* Mes_Serial,char* Mes_Key_Serial,char* Message)//消息整合函数。
麻烦大家帮忙看看。先谢谢了。
PS:(可以放到自己的编译环境下运行看看结果)
...全文
251 12 打赏 收藏 转发到动态 举报
写回复
用AI写文章
12 条回复
切换为时间正序
请发表友善的回复…
发表回复
leee7338 2015-06-24
  • 打赏
  • 举报
回复
引用 7 楼 zhao4zhong1 的回复:
注意修改了楼上对应函数的代码: [/code]
多谢赵四老师指出的错误并且给出了方法。虽然跑起来有点问题,不过我会自己搞定。我先好好研究一下。 谢谢了。
leee7338 2015-06-24
  • 打赏
  • 举报
回复
引用 8 楼 fly_dragon_fly 的回复:
看起来是把求字符串长度用成了sizeof, 应该是strlen的
哎,谢谢了。C语言水平太烂了。
leee7338 2015-06-24
  • 打赏
  • 举报
回复
引用 9 楼 JiangWenjie2014 的回复:
代码写成这副德行,真是无语!
谢谢您,我的C语言水平实在太差,正在努力中。我会把您指出的错误好好整理,并养成一个好的代码书写规范。
JiangWenjie2014 2015-06-24
  • 打赏
  • 举报
回复
代码写成这副德行,真是无语!

#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;
}
fly_dragon_fly 2015-06-24
  • 打赏
  • 举报
回复
看起来是把求字符串长度用成了sizeof, 应该是strlen的
赵4老师 2015-06-24
  • 打赏
  • 举报
回复
注意修改了楼上对应函数的代码:
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;

}
赵4老师 2015-06-24
  • 打赏
  • 举报
回复
///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;
}

leee7338 2015-06-24
  • 打赏
  • 举报
回复
引用 1 楼 zhao4zhong1 的回复:
崩溃的时候在弹出的对话框按相应按钮进入调试,按Alt+7键查看Call Stack即“调用堆栈”里面从上到下列出的对应从里层到外层的函数调用历史。双击某一行可将光标定位到此次调用的源代码或汇编指令处,看不懂时双击下一行,直到能看懂为止。
我自己搞不定啊 赵四老师
leee7338 2015-06-24
  • 打赏
  • 举报
回复
引用 3 楼 zhangxiangDavaid 的回复:
宏定义,直接使用,不需要传递

#define RES_C_WEAKUP        "A_WEAKUP"//唤醒应答
#define RES_C_ENGINSTART    "A_ENGINSTART"//启动应答
#define RES_C_OPENLOCK      "A_OPENLOCK"//遥控开锁应答
#define RES_C_CLOSELOCK     "A_CLOSELOCK"//锁门应答
/*....................*/
因为有很多宏,每一个应答命令要写一个函数来实现消息的拼接。所以我想写一个共通函数,让每一个命令函数调用它
苏叔叔 2015-06-24
  • 打赏
  • 举报
回复
宏定义,直接使用,不需要传递
赵4老师 2015-06-24
  • 打赏
  • 举报
回复
VC编译选项加/EP /P,重新编译,查看宏展开后对应的.i文件。gcc加-E http://bbs.csdn.net/topics/391003898
赵4老师 2015-06-24
  • 打赏
  • 举报
回复
崩溃的时候在弹出的对话框按相应按钮进入调试,按Alt+7键查看Call Stack即“调用堆栈”里面从上到下列出的对应从里层到外层的函数调用历史。双击某一行可将光标定位到此次调用的源代码或汇编指令处,看不懂时双击下一行,直到能看懂为止。

69,374

社区成员

发帖
与我相关
我的任务
社区描述
C语言相关问题讨论
社区管理员
  • C语言
  • 花神庙码农
  • 架构师李肯
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧