Указатель на функцию различного поведения в GCC и Arduino - PullRequest
2 голосов
/ 03 июня 2019

В моей C-программе у меня есть скелет для интерпретатора команд. Он отлично работает в Linux / GCC, но в Arduino не возвращает ожидаемых результатов.

Ниже найдите код ПК. Я сделал соответствующие изменения для Arduino, и он работает, за исключением строки возврата (см. Вторую строку снизу в листинге).

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 голосов
/ 03 июня 2019

Спасибо за совет.Я изменил код следующим образом (заглядывая в 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);
}
0 голосов
/ 03 июня 2019

Это допустимый код C (за исключением отсутствующего оператора return в main), и соответствующий компилятор C должен принять его и создать работающий исполняемый файл.В частности, использование вами указателей на функции не связано с рассматриваемой проблемой.Кроме того, в руководстве по avr-gcc не упоминаются какие-либо соответствующие ограничения.У меня нет Arduino под рукой, чтобы проверить поведение, но если avr-gcc не выдает рабочий код для ввода, который вы показали, то это говорит об ошибке в компиляторе.

0 голосов
/ 03 июня 2019
char* help(char *s){
  char *helpString="This is the help string\n";
  return helpString;
}

Вы возвращаете локальную переменную - она ​​перестает существовать после выхода из области действия функции. То, что он работает на любой платформе, - это просто удача, поскольку, как только он перестает существовать, попытка получить доступ к строке - неопределенное поведение.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...