Ошибка получения адреса временного массива при передаче массива составных литералов

У меня есть скетч Arduino, который передает массив в метод как составной литерал, но по какой-то причине я продолжаю получать следующую ошибку:

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

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

Я также пытался передать количество указателей/длину массива и явно завершить его:

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

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

...и

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

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

Но они оба выдают одну и ту же ошибку.

Каков правильный метод передачи массива составных литералов в качестве параметра метода?

, 👍0

Обсуждение

Вы не можете. Вы должны присвоить его чему-то, а затем передать эту переменную., @Majenko

Либо так, либо перепишите свою функцию, чтобы использовать переменные аргументы., @Majenko

Это ограничение специфично для Arduino? Насколько я понимаю, вы можете сделать это в C., @McWayWeb

Я не уверен, но подозреваю, что это следствие того, что AVR является процессором с модифицированной гарвардской архитектурой., @Majenko

https://stackoverflow.com/questions/32941846/c-error-taking-address-of-temporary-array, @Majenko

Чего вы на самом деле пытаетесь достичь с помощью этой функции?, @Majenko

Мне нужен был метод для печати любого количества строк/переменных вместе в одной строке, чтобы обойти ограничение необходимости отправлять по одной в Serial.print. Я хотел добиться той же функциональности, что-то похожее на: Serial.println ("{" + var1 "-" + var2 + "}");, @McWayWeb

На самом деле Arduino использует C++., @the busybee


1 ответ


Лучший ответ:

2

Вы не можете с Arduino. Я не совсем уверен, почему, но я думаю, что это может быть потому, что это машина с модифицированной гарвардской архитектурой.

С помощью вариативных аргументов вы можете достичь желаемого. однако:

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() {

}

Первый аргумент — это количество следующих за ним аргументов, а все остальные — строковые константы.

,