user-0 提问: 求高手！关于函数指针参数调用  字符串  宏的问题。  急 ！！！

回复:
user: user-0
content: 引用 7 楼 zhao4zhong1 的回复:注意修改了楼上对应函数的代码： [/code] 多谢赵四老师指出的错误并且给出了方法。虽然跑起来有点问题，不过我会自己搞定。我先好好研究一下。 谢谢了。

user: user-0
content: 引用 8 楼 fly_dragon_fly 的回复:看起来是把求字符串长度用成了sizeof, 应该是strlen的 哎，谢谢了。C语言水平太烂了。

user: user-0
content: 引用 9 楼 JiangWenjie2014 的回复:代码写成这副德行，真是无语！ 谢谢您，我的C语言水平实在太差，正在努力中。我会把您指出的错误好好整理，并养成一个好的代码书写规范。

user: user-1
content: 代码写成这副德行，真是无语！  #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; }

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

user: user-3
content: 注意修改了楼上对应函数的代码： 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;  }

user: user-3
content: ///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; }

user: user-0
content: 引用 1 楼 zhao4zhong1 的回复:崩溃的时候在弹出的对话框按相应按钮进入调试，按Alt+7键查看Call Stack即“调用堆栈”里面从上到下列出的对应从里层到外层的函数调用历史。双击某一行可将光标定位到此次调用的源代码或汇编指令处，看不懂时双击下一行，直到能看懂为止。 我自己搞不定啊  赵四老师

user: user-0
content: 引用 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"//锁门应答 /*....................*/  因为有很多宏，每一个应答命令要写一个函数来实现消息的拼接。所以我想写一个共通函数，让每一个命令函数调用它

user: user-4
content: 宏定义，直接使用，不需要传递

user: user-3
content: VC编译选项加/EP /P，重新编译，查看宏展开后对应的.i文件。gcc加-E http://bbs.csdn.net/topics/391003898

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