2011-04-25 61 views
1

我在Arduino 022中为Arduino Mini Pro编程。我有以下功能:Arduino上的变量函数

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中的内置LED亮起。 “连接”永远不会被打印到串行监视器上。 Arduino不允许使用可变参数吗?

+1

你也可以包含你的通话代码吗? – baalexander 2011-04-25 17:03:39

回答

1

您不能将大多数类类型传递给可变参数函数 - 仅限POD类型(标准中为5.2.2第7段);如果你这样做的行为是未定义的 - 这可能会导致你遇到的问题。我很确定Arduino String class不是POD,所以这是行不通的。

你可能会更好使用字符数组(在一些地方至少),例如

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

如果没有在调用点引起太多丑陋,或者只是提供重载1 N弦。

另外 - 一个字符串对象可以等于NULL吗?您对strArg != NULL的测试看起来很可疑。

1

当你调用的代码,它看起来像:

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

或:

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

你必须自己提供NULL终止 - 编译器不会去做。

编辑:这假设String是char *的typedef(因为你将它与NULL进行比较),但是如果它的代码有其他许多错误。请澄清什么类型的字符串。

+0

'String'是arduino库中的类,不是'typedef''。 – val 2017-12-04 20:13:29