有没有比switch语句更好的方法?
列出所有有效的操作代码(作为程序内存中的常量,因此不会使用任何稀缺的RAM),并逐个将每个代码与接收到的代码进行比较。也许可以将索引“0”保留为“未知操作代码”。
例如:
typedef int (*ActionFunctionPointer)( int, int, char * );
struct parse_item{
const char action_letter;
const int action_number;
const ActionFunctionPointer action_function_pointer;
};
int m0_handler( int speed, int extrude_rate, char * message ){
speed_x = 0; speed_y = 0; speed_z = 0; speed_e = 0;
}
int g4_handler ( int dwell_time, int extrude_rate, char * message ){
delay(dwell_time);
}
const struct parse_item parse_table[] = {
{ '\0', 0, unrecognized_action }
{ 'M', 0, m0_handler },
{ 'G', 4, g4_handler },
{ '\0', 0, unrecognized_action }
}
ActionFunctionPointer get_action_function_pointer( char * buffer ){
char letter = get_letter( buffer );
int action_number = get_number( buffer );
int index = 0;
ActionFunctionPointer f = 0;
do{
index++;
if( (letter == parse_table[index].action_letter ) and
(action_number == parse_table[index].action_number) ){
f = parse_table[index].action_function_pointer;
};
if('\0' == parse_table[index].action_letter ){
index = 0;
f = unrecognized_action;
};
}while(0 == f);
return f;
}
如何在C语言中使用函数指针,当名称(和可能的签名)可能会改变时?如果函数签名不同,这是否可行?
可以使用varargs在C语言中创建一个函数指针,该函数指针(在不同时间)指向具有更多或更少参数(不同签名)的函数。
或者,您可以通过向需要比其他函数少参数的函数添加“虚拟”参数来强制所有可能由该函数指针指向的函数都具有完全相同的参数和返回值(相同的签名)。
根据我的经验,“虚拟参数”方法似乎更容易理解,并且使用的内存比varargs方法少。
是否有一种方式将通用类型的typedef传递并从中调用该签名?
是的。我几乎见过所有使用函数指针的代码都创建了一个typedef来引用该特定类型的函数。(当然,除了{{link1:混淆竞赛条目}})。
请参考上面的示例和
Wikibooks:C编程:函数指针以获取详细信息。
p.s.:你重复发明轮子的原因是什么?也许,以下现有的AVR G-code解释器之一可以对你有所帮助,也许需要稍作调整:
FiveD,
Sprinter,
Marlin,
Teacup Firmware,
sjfw,
Makerbot,
或者
Grbl?
(请参见http://reprap.org/wiki/Comparison_of_RepRap_Firmwares)。