关于函数指针参数调用 字符串 宏的问题

C语言 码拜 10年前 (2015-07-10) 1143次浏览 0个评论

#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:(可以放到自己的编译环境下运行看看结果)

 
崩溃的时候在弹出的对话框按相应按钮进入调试,按Alt+7键查看Call Stack即“调用堆栈”里面从上到下列出的对应从里层到外层的函数调用历史。双击某一行可将光标定位到此次调用的源代码或汇编指令处,看不懂时双击下一行,直到能看懂为止。
 
VC编译选项加/EP /P,重新编译,查看展开后对应的.i文件。gcc加-E http://bbs.csdn.net/topics/391003898

5分

定义,直接使用,不需要传递
 
引用 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"//锁门应答
/*....................*/

因为有很多,每一个应答命令要写一个函数来实现消息的拼接。所以我想写一个共通函数,让每一个命令函数调用它

 
引用 1 楼 zhao4zhong1 的回复:

崩溃的时候在弹出的对话框按相应按钮进入调试,按Alt+7键查看Call Stack即“调用堆栈”里面从上到下列出的对应从里层到外层的函数调用历史。双击某一行可将光标定位到此次调用的源代码或汇编指令处,看不懂时双击下一行,直到能看懂为止。

我自己搞不定啊 赵四老师

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;
}
 
引用 9 楼 JiangWenjie2014 的回复:

代码写成这副德行,真是无语!

谢谢您,我的C语言水平实在太差,正在努力中。我会把您指出的错误好好整理,并养成一个好的代码书写规范。

 
引用 8 楼 fly_dragon_fly 的回复:

看起来是把求字符串长度用成了sizeof, 应该是strlen的

哎,谢谢了。C语言水平太烂了。

 
引用 7 楼 zhao4zhong1 的回复:

注意修改了楼上对应函数的代码:
[/code]

多谢赵四老师指出的错误并且给出了方法。虽然跑起来有点问题,不过我会自己搞定。我先好好研究一下。
谢谢了。


CodeBye 版权所有丨如未注明 , 均为原创丨本网站采用BY-NC-SA协议进行授权 , 转载请注明关于函数指针参数调用 字符串 宏的问题
喜欢 (0)
[1034331897@qq.com]
分享 (0)

文章评论已关闭!