2011-04-25 102 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