0

I have an Arduino sketch that passes an array into a method as a compound literal, but for some reason I keep getting the following error:

void setup() { }
void printConcatLine(char chunks[][20]) { }

void loop() {  
  printConcatLine((char[][20]){ "{", "255", "}" });
}

I've also tried passing the number of the pointers/length of the array, and explicitly terminating it:

void setup() { }
void printConcatLine(char *chunks[]) { }

void loop() {  
  printConcatLine((char*[]){ "{", "255", "}", NULL });
}

...and

void setup() { }
void printConcatLine(char chunks[][20]) { }

void loop() {  
  printConcatLine((char[][20]){ "{", "255", "}", "" });
}

But they both produce the same error.

What is the correct method of passing the compound literal array as a method parameter?

8
  • You can't. You have to assign it to something then pass that variable. – Majenko Jun 7 '20 at 20:28
  • Either that or rewrite your function to use variadic arguments. – Majenko Jun 7 '20 at 20:29
  • Is this limitation specific to Arduino? From what I understand you can do this in C. – McWayWeb Jun 7 '20 at 20:31
  • I am not sure, but I suspect it's a consequence of the AVR being a Modified Harvard Architecture CPU. – Majenko Jun 7 '20 at 20:32
  • 1
2

You can't with the Arduino. I am not quite sure why, but I think it may be because it's a Modified Harvard architecture machine.

You can better achieve what you want with variadic arguments, however:

void printConcatLine(int num, ...) {
    va_list ap;
    const char *s;

    va_start(ap, num);
    for (int i = 0; i < num; i++) {
        s = va_arg(ap, const char *);
        Serial.print(s);
    }
    va_end(ap);
    Serial.println();
}

void setup() {
    Serial.begin(115200);
    printConcatLine(3, "{", "255", "}");
}

void loop() {

}

The first argument is the number of arguments that follow, and all the rest are string constants.

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service, privacy policy and cookie policy

Not the answer you're looking for? Browse other questions tagged or ask your own question.