字符串能不能转成枚举常量?或者给一个方法。谢谢

leee7338 2015-07-02 12:04:59
说明:我有一堆命令,每一个命令都对应一个相应的命令操作函数。
串口随机发送一串命令,像:$C_ABC:0040,1\r\n,解析之后得到命令,进入相应的处理函数。
我把这堆命令放到一个枚举里面

enum {
C_ABC,
C_DEF,
C_GHT,
.........},

定义一个函数指针数组,存放着指向命令处理函数的指针。

int (*func[43])(char* ,char* )={function1,function2,function3,.........};

我想解析完消息得到命令之后直接根据命令调用其对应的命令操作函数。
现在的问题是,解析完命令例如是:C_ABC是一个字符串,如果在不知道是什么命令的情况下,怎样调用其对应的命令操作函数。

(*func[C_ABC])(char* a,char* b);//这里面的C_ABC是枚举常量,怎么用解析的字符串来表示

恳请大家帮我想想如何让字符串表示成枚举的常量,或者是其他办法实现(得到随机命令 调用其对应的操作函数)。
还有效率的问题例如,方法1:如果是定义一个结构体数组,初始化的时候把这一堆命令和他的对应函数写进去。和上面用枚举函数指针数组的方法那个效率更高一些?
我说的比较啰嗦,谢谢大家能认真看完。
...全文
540 23 打赏 收藏 转发到动态 举报
写回复
用AI写文章
23 条回复
切换为时间正序
请发表友善的回复…
发表回复
leee7338 2015-07-04
  • 打赏
  • 举报
回复
引用 20 楼 Charce1989 的回复:
我觉得 你不要定义enum 定义个字符串数组,和你的函数指针数组 对应,每次解析命令之后在字符串数组里找到,然后返回下标,利用这个下标再去函数指针数组找对应的function 。
弄个结构体 直接初始化进去命令和函数。哎估计只能这样了。谢谢你
leee7338 2015-07-04
  • 打赏
  • 举报
回复
引用 18 楼 zhao4zhong1 的回复:
仅供参考:
//codegen.c
// 输入一组字符串,比如
// aa ss ddd dd 33 dd
// 然后自动生成一个函数 int A(const char*);
// 实现A("aa")返回0  A("ss")返回1 依次类推
#include <stdio.h>
int main(int argc,char **argv) {
    int i;
    if (argc<2) {
        printf("%s p1 [p2 ...] [>result.c]\nGenerate code int A(const char *a); 0==A(\"p1\") 1==A(\"p2\") ...",argv[0]);
        return 1;
    }
    //printf("#include <string.h>\n");
    printf("int A(const char *a) {\n");
    for (i=0;i<argc-1;i++) {
        printf("    if (0==strcmp(a,\"%s\")) return %d;\n",argv[i+1],i);
    }
    printf("    return -1;\n");
    printf("}\n");
    return 0;
}
//C:\test\Debug>codegen.exe
//codegen.exe p1 [p2 ...] [>result.c]
//Generate code int A(const char *a); 0==A("p1") 1==A("p2") ...
//C:\test\Debug>codegen.exe aa ss ddd dd 33 dd
//int A(const char *a) {
//    if (0==strcmp(a,"aa")) return 0;
//    if (0==strcmp(a,"ss")) return 1;
//    if (0==strcmp(a,"ddd")) return 2;
//    if (0==strcmp(a,"dd")) return 3;
//    if (0==strcmp(a,"33")) return 4;
//    if (0==strcmp(a,"dd")) return 5;
//    return -1;
//}
//
//c:\test\Debug>codegen.exe aa ss ddd dd 33 dd >result.c
//
//c:\test\Debug>type result.c
//int A(const char *a) {
//    if (0==strcmp(a,"aa")) return 0;
//    if (0==strcmp(a,"ss")) return 1;
//    if (0==strcmp(a,"ddd")) return 2;
//    if (0==strcmp(a,"dd")) return 3;
//    if (0==strcmp(a,"33")) return 4;
//    if (0==strcmp(a,"dd")) return 5;
//    return -1;
//}
//
我感觉这样不太好,因为我还要判断函数是否执行成功return SUCCESS。而且这样我感觉这个函数有点大,因为要判断50多次我有50多个命令。我还是改了吧。哎大改特改,以后写代码要先构思好。还是谢谢赵四老师了
leee7338 2015-07-04
  • 打赏
  • 举报
回复
引用 17 楼 zhangxiangDavaid 的回复:
[quote=引用 6 楼 leee7338 的回复:] [quote=引用 5 楼 fly_dragon_fly 的回复:] 这种命令通常不会太长,直接查找命令试试看
typedef void (*EXEC)(char *);
void helloAbc(char *){}
struct disp{
    char *cmd;
    EXEC fun;
} Disp[]={
    { "ABC", helloAbc }
};
引用 5 楼 fly_dragon_fly 的回复:
就是把命令和函数都放到一个结构体里面,定义一个结构体数组么?
大概是这样:

typedef void(*EXEC)(char *, char *);
void fun1(char *s1, char *s2) {}
void fun2(char *s1, char *s2) {}
void fun3(char *s1, char *s2) {}
struct disp {
	char *cmd;
	EXEC fun;
} Disp[] = {
	{"C_ABC", fun1},
	{"C_DEF", fun2},
	{"C_GHI", fun3},
};
int main(void)
{
	int i;
	char *cmd = "C_ABC";
	for (i = 0; i < 3; i++)
	{
		if (0 == strcmp(Disp[i].cmd, cmd))
			Disp[i].fun();    //这里还需传入合适的参数
	}
	return 0;
}
[/quote] 估计只能这样了。
xiaodong60606 2015-07-03
  • 打赏
  • 举报
回复
命令是字符串,枚举是int型,估计只能比较。
hejiajie1989 2015-07-03
  • 打赏
  • 举报
回复
我觉得 你不要定义enum 定义个字符串数组,和你的函数指针数组 对应,每次解析命令之后在字符串数组里找到,然后返回下标,利用这个下标再去函数指针数组找对应的function 。
mewiteor 2015-07-02
  • 打赏
  • 举报
回复
引用 12 楼 mewiteor 的回复:
[quote=引用 10 楼 leee7338 的回复:] [quote=引用 9 楼 mewiteor 的回复:] 串口发的字符串集你能改吗? 比如用单个字符可以直接用字符的ascii码作枚举常量的值, 或者有4个字符的相同长度的字符串用 *(int*)string 作枚举常量的值。 如果不能改可以用字典树
能说的稍微明白点 或者举个例子么[/quote] 你能否把命令简化为单个字符,比如:A、B、C、…… 如果可以的话,以字符为下标,调用:func['A'](...); 这样就比较方便。 如果不能改串口发出的命令集,那你就百度一个Trie树的代码吧。[/quote] 也可以将命令集排好序放入一个数组中,比如:
struct{char *code;int (*func)(char*,char*);} array[]={{"C_ABC",function1},{"C_DEF",function2},{"C_GHI",function3}};
然后用bsearch二分搜索。
GKatHere 2015-07-02
  • 打赏
  • 举报
回复
呵呵, 对上面补充下: 如果对字符串算法处理后, 其值于一小范围内, 如: 100015 - 100045; 此时就可以用数组了.
GKatHere 2015-07-02
  • 打赏
  • 举报
回复
对命令字符串进行算法处理(如: C_ABC = "c" << 0 + "B" << 8 + 'A' << 16 + 'C' << 24); 然后排序(树也可以); 查找时候先用算法处理, 再用二分法查找...
mewiteor 2015-07-02
  • 打赏
  • 举报
回复
引用 10 楼 leee7338 的回复:
[quote=引用 9 楼 mewiteor 的回复:] 串口发的字符串集你能改吗? 比如用单个字符可以直接用字符的ascii码作枚举常量的值, 或者有4个字符的相同长度的字符串用 *(int*)string 作枚举常量的值。 如果不能改可以用字典树
能说的稍微明白点 或者举个例子么[/quote] 你能否把命令简化为单个字符,比如:A、B、C、…… 如果可以的话,以字符为下标,调用:func['A'](...); 这样就比较方便。 如果不能改串口发出的命令集,那你就百度一个Trie树的代码吧。
king191923157 2015-07-02
  • 打赏
  • 举报
回复
楼主要是不想改动大的话,也可以map(string,emnu) 一下, 不过这样做没有楼上几个个方法直接,有点冗余
leee7338 2015-07-02
  • 打赏
  • 举报
回复
引用 9 楼 mewiteor 的回复:
串口发的字符串集你能改吗? 比如用单个字符可以直接用字符的ascii码作枚举常量的值, 或者有4个字符的相同长度的字符串用 *(int*)string 作枚举常量的值。 如果不能改可以用字典树
能说的稍微明白点 或者举个例子么
mewiteor 2015-07-02
  • 打赏
  • 举报
回复
串口发的字符串集你能改吗? 比如用单个字符可以直接用字符的ascii码作枚举常量的值, 或者有4个字符的相同长度的字符串用 *(int*)string 作枚举常量的值。 如果不能改可以用字典树
leee7338 2015-07-02
  • 打赏
  • 举报
回复
请大家给一个好的方法。
lniwn 2015-07-02
  • 打赏
  • 举报
回复
std::map<std::string, std::function<int(char*,char*)>>
leee7338 2015-07-02
  • 打赏
  • 举报
回复
引用 5 楼 fly_dragon_fly 的回复:
这种命令通常不会太长,直接查找命令试试看
typedef void (*EXEC)(char *);
void helloAbc(char *){}
struct disp{
    char *cmd;
    EXEC fun;
} Disp[]={
    { "ABC", helloAbc }
};
[quote=引用 5 楼 fly_dragon_fly 的回复:] 就是把命令和函数都放到一个结构体里面,定义一个结构体数组么?
fly_dragon_fly 2015-07-02
  • 打赏
  • 举报
回复
这种命令通常不会太长,直接查找命令试试看
typedef void (*EXEC)(char *);
void helloAbc(char *){}
struct disp{
    char *cmd;
    EXEC fun;
} Disp[]={
    { "ABC", helloAbc }
};
leee7338 2015-07-02
  • 打赏
  • 举报
回复
引用 2 楼 jiqiang01234 的回复:
把枚举值和对应的字符串做映射
请问怎么映射?
leee7338 2015-07-02
  • 打赏
  • 举报
回复
引用 1 楼 zhao4zhong1 的回复:
enum {
C_ABC, //0
C_DEF,//1
C_GHT,//2
.........},
我是想根据解析出来的字符串来确定要用哪个函数处理
jiqiang01234 2015-07-02
  • 打赏
  • 举报
回复
把枚举值和对应的字符串做映射
赵4老师 2015-07-02
  • 打赏
  • 举报
回复
仅供参考:
//codegen.c
// 输入一组字符串,比如
// aa ss ddd dd 33 dd
// 然后自动生成一个函数 int A(const char*);
// 实现A("aa")返回0  A("ss")返回1 依次类推
#include <stdio.h>
int main(int argc,char **argv) {
    int i;
    if (argc<2) {
        printf("%s p1 [p2 ...] [>result.c]\nGenerate code int A(const char *a); 0==A(\"p1\") 1==A(\"p2\") ...",argv[0]);
        return 1;
    }
    //printf("#include <string.h>\n");
    printf("int A(const char *a) {\n");
    for (i=0;i<argc-1;i++) {
        printf("    if (0==strcmp(a,\"%s\")) return %d;\n",argv[i+1],i);
    }
    printf("    return -1;\n");
    printf("}\n");
    return 0;
}
//C:\test\Debug>codegen.exe
//codegen.exe p1 [p2 ...] [>result.c]
//Generate code int A(const char *a); 0==A("p1") 1==A("p2") ...
//C:\test\Debug>codegen.exe aa ss ddd dd 33 dd
//int A(const char *a) {
//    if (0==strcmp(a,"aa")) return 0;
//    if (0==strcmp(a,"ss")) return 1;
//    if (0==strcmp(a,"ddd")) return 2;
//    if (0==strcmp(a,"dd")) return 3;
//    if (0==strcmp(a,"33")) return 4;
//    if (0==strcmp(a,"dd")) return 5;
//    return -1;
//}
//
//c:\test\Debug>codegen.exe aa ss ddd dd 33 dd >result.c
//
//c:\test\Debug>type result.c
//int A(const char *a) {
//    if (0==strcmp(a,"aa")) return 0;
//    if (0==strcmp(a,"ss")) return 1;
//    if (0==strcmp(a,"ddd")) return 2;
//    if (0==strcmp(a,"dd")) return 3;
//    if (0==strcmp(a,"33")) return 4;
//    if (0==strcmp(a,"dd")) return 5;
//    return -1;
//}
//
加载更多回复(3)

69,371

社区成员

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

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