2011-04-25 22 views
1

Arduino Mini ProのArduino 022でプログラミングしています。ArduinoのVariadic関数

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

答えて

1

variadic関数にほとんどのクラス型を渡すことはできません - POD型(標準では5.2.2パラ7)。あなたが行った場合、その動作は未定義です - あなたが得ている問題を引き起こす可能性があります。私はArduino String classがPODではないと確信しているので、これはうまくいきません。

あなたは(少なくともいくつかの場所で)文字の配列を使用した方が良いかもしれません、例えば

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

これは、呼び出しサイトであまりにも多くの醜さを引き起こす、または多分ちょうど1のためのオーバーロードを提供しない場合Nストリング。

また、StringオブジェクトはNULLに等しいことはありますか? strArg != NULLのテストは疑わしいです。

1

あなたがコードを呼び出すと、それがどのように見えるん:

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

か:

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

をあなたはNULL終端を自分で提供する必要があります - コンパイラはそれを行うことはありません。

編集:文字列がchar *の型定義であることを前提としています(NULLと比較するため)。ただし、それ以外の場合はコードに問題があります。文字列の種類が何であるかを明確にしてください。

+0

'String'はarduinoライブラリのクラスであり、' typedef'されていません。 – val

関連する問題