在我的C程序中,我有一个命令解释器的框架。在Linux / GCC上可以正常工作,但是在Arduino上它不会返回预期的结果。
在下面找到PC代码。我对Arduino进行了适当的更改,除了返回字符串(请参见清单底部的第二行)以外,它都可以工作。
PC上的C代码(正在运行):
#include <stdio.h>
char* help(char *s){
char *helpString="This is the help string\n";
return helpString;
}
typedef struct {
const char* command;
char* (*cmdExec)(char *s);
}S_COMMAND;
S_COMMAND cmdTable[]= {
{"he", help}
};
int main(void){
char *text;
printf("\n%s\t",cmdTable[0].command); // returns "he"
text = (cmdTable[0].cmdExec)("0");
/* returns help string on PC as expected, but garbage on Arduino */
printf("\n%s", text);
}
答案 0 :(得分:0)
感谢您的建议。我修改了如下代码(查看Node.JS),现在在两个平台上都能正常工作。
int help(char *req, char *res){
strcpy(res, "This is the help string...\n");
return 0;
}
typedef struct {
char* command;
int (*cmdExec)(char *request, char *result);
}S_COMMAND;
S_COMMAND cmdTable[]= {
{"he", help}
};
int main(void){
char text[20];
cmdTable[0].cmdExec("0", text);
}
答案 1 :(得分:0)
这是有效的C代码(return
中缺少的main
语句除外),并且合格的C编译器应接受它并生成可运行的可执行文件。特别是,函数指针的使用与当前的问题无关。此外,avr-gcc手册未提及任何相关限制。我没有一个Arduino可以测试行为,但是如果avr-gcc不能为您显示的输入生成有效的代码,则表明编译器存在错误。
答案 2 :(得分:-3)
Set
您将返回一个局部变量-一旦超出函数范围,该变量便不再存在。它在任何平台上都可以正常运行是纯粹的运气,因为一旦它不再存在,尝试访问该字符串是不确定的行为。