函数指针在GCC和Arduino中的不同行为

时间:2019-06-03 09:41:30

标签: c gcc arduino

在我的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);
}

3 个答案:

答案 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

您将返回一个局部变量-一旦超出函数范围,该变量便不再存在。它在任何平台上都可以正常运行是纯粹的运气,因为一旦它不再存在,尝试访问该字符串是不确定的行为。