Вариадические функции на Arduino - PullRequest
1 голос
/ 25 апреля 2011

Я программирую на Arduino 022 для Arduino Mini Pro.У меня есть следующая функция:

  String join(const String str, ...) {
    Serial.println("join");
    va_list args;
    va_start(args, str);

    Serial.println("result init");
    String result = "";

    for (String strArg = str; strArg != NULL; strArg = va_arg(args, String)) {
      Serial.println(result);
      result += strArg + ARG_DELIMITER;
    }

    result = result.substring(0, result.length() - 1);

    Serial.println("join end");

    return result;
  }

Когда я вызываю эту функцию, программа останавливается, и включается встроенный светодиод на выводе 13."join" никогда не печатается на последовательном мониторе.Разве вариационные функции не разрешены на Arduino?

Ответы [ 2 ]

2 голосов
/ 25 апреля 2011

Вы не можете передать большинство типов классов в функцию с переменным числом аргументов - только типы POD (5.2.2, параграф 7 в стандарте);если вы делаете, поведение не определено - что может вызвать проблемы, которые вы получаете.Я уверен, что Arduino String class не является POD, поэтому это не сработает.

Возможно, вам лучше использовать массивы char (по крайней мере, в некоторых местах)например,

String join(char const * const str, ...)

, если это не вызывает уродства на месте вызова или, возможно, просто обеспечивает перегрузки для строк от 1 до N.

Также - может ли когда-либо быть объект Stringравно NULL?Ваш тест на strArg != NULL выглядит сомнительным.

1 голос
/ 25 апреля 2011

Когда вы вызываете код, это выглядит так:

 join( "foo", "bar", NULL );   // ok

или

 join( "foo", "bar" );        // wrong

Вы должны предоставить терминатор NULL самостоятельно - компилятор этого не сделает.

Редактировать: Предполагается, что String является typedef для char * (потому что вы сравниваете его с NULL), но если это так, то в вашем коде есть много других ошибок. Пожалуйста, уточните, что это за тип String.

...