Ошибка получения адреса временного массива при передаче массива составных литералов
У меня есть скетч 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", "}", "" });
}
Но они оба выдают одну и ту же ошибку.
Каков правильный метод передачи массива составных литералов в качестве параметра метода?
@McWayWeb, 👍0
Обсуждение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() {
}
Первый аргумент — это количество следующих за ним аргументов, а все остальные — строковые константы.
,
@Majenko
Смотрите также:
- Передача массивов, глобальных массивов внутри функций, указателей и объявление размеров массивов.
- Можно ли создать массив для функций?
- Невозможно преобразовать 'int (*)[size]' в 'int**': Cannot convert 'int (*)[size]' to 'int**'
- Как удалить элемент из массива arduino?
- Работает с gcc, но не с Arduino. ошибка: taking address of temporary array
- Как вернуть значение массива символов в функции Arduino IDE?
- Установка указателя массива на null при объявлении
- Вычислить размер массива, который был передан в качестве параметра функции
Вы не можете. Вы должны присвоить его чему-то, а затем передать эту переменную., @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