假设我正在与串行端口设备进行通信,并且具有大量用于控制此类设备的命令(74)。这是存储和使用它们的最佳方式吗?
当然,我可以通过以下方式组织它们:
static char *cmd_msgs[] =
{
"start",
"stop",
"reset",
"quit",
"",
"",
"",
"",
...
};
或人类可读:
char cmd_start_str[] = "start";
...
char cmd_quit_str[] = "quit";
有人可以指出处理此类任务的工作示例吗?
答案 0 :(得分:5)
第一种方法很好 - 不要使用具有唯一名称的大量全局变量,特别是当您想要循环它们时,它们很难引用。这就是字符串数组的目的(你的第一种方式)。如果您需要人类可读的代码(您应该使用它),请使用一个明确命名的枚举,其值与实际命令字符串相对应。所以做一些像
这样的事情const char *cmds[] = {
"command 1",
"command 2",
"Print Hello World",
"Explode House"
};
enum {
COMMAND_ONE,
COMMAND_TWO,
COMMAND_SAYHELLO,
COMMAND_BOOM
};
通过这种方式,您可以通过索引数组轻松引用命令,但是通过编写cmds[COMMAND_SAYHELLO]
等仍然可以获得可读性。
答案 1 :(得分:1)
如果使用第一个选项,通常需要第二组常量,或#defines来定义数组中每个字符串的偏移量:
e.g。
#DEFINE cmd_start 0
#DEFINE cmd_stop 1
所以可以使用cmd_msgs[cmd_start]
所以我会选择第二个选项
char* cmd_start_str = "start";
答案 2 :(得分:0)
对于这个应用程序,我会使用一组结构。
// Command handler signature. Choose as per your requirement.
typedef int (*cmdHandlerType)(char * hostCmdString);
//Command Structure
typedef struct
{
char *commandString; /**< points to the Command String*/
cmdHandlerType cmdHandler; /**< points to the Command function*/
} commandStruct;
//All the commands and its functions
static commandStruct Commands[] = {
{"TEMP", TempCommand},
{"GAIN", GainCommand},
{"SETPT", SetPtCommand},
{"...", ... },
};
int TempCommand( char *str)
{
...
}
这样,当您从主机获取命令时,您可以匹配命令字符串并调用相应的处理程序。