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?
-
You can't. You have to assign it to something then pass that variable.Majenko– Majenko2020年06月07日 20:28:28 +00:00Commented Jun 7, 2020 at 20:28
-
Either that or rewrite your function to use variadic arguments.Majenko– Majenko2020年06月07日 20:29:09 +00:00Commented Jun 7, 2020 at 20:29
-
Is this limitation specific to Arduino? From what I understand you can do this in C.VerySeriousSoftwareEndeavours– VerySeriousSoftwareEndeavours2020年06月07日 20:31:45 +00:00Commented Jun 7, 2020 at 20:31
-
I am not sure, but I suspect it's a consequence of the AVR being a Modified Harvard Architecture CPU.Majenko– Majenko2020年06月07日 20:32:31 +00:00Commented Jun 7, 2020 at 20:32
-
1stackoverflow.com/questions/32941846/…Majenko– Majenko2020年06月07日 20:34:39 +00:00Commented Jun 7, 2020 at 20:34
1 Answer 1
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.