warning: variable 'b' set but not used
Я получил следующую ошибку:
предупреждение: переменная 'b' установлена, но не используется
.
Мне кажется, я делаю что-то совсем маленькое неправильно, но не могу понять, что именно.
#define array_size(array) ((int)(sizeof(array) / sizeof((array)[0])))
typedef struct Boid {
unsigned long start_animate_time;
} Boid;
Boid boids[4];
Boid create_boid() {
unsigned long start_animate_time = 0L;
Boid b = {start_animate_time};
return b;
}
void setup() {
Serial.begin(9600);
boids[0] = create_boid();
boids[1] = create_boid();
boids[2] = create_boid();
boids[3] = create_boid();
for (int i = 0; i < array_size(boids); i++) {
Boid b = boids[i]; // <<<<<<<<<<<< эта строка!
b.start_animate_time = 456;
}
for (int i = 0; i < array_size(boids); i++) {
Boid b = boids[i];
Serial.println(b.start_animate_time); // ОШИБКА всегда 0
}
}
void loop() {
}
flock_01_ino_debug.ino:28:10: предупреждение: переменная 'b' установлена, но не используется [-Wнеиспользуется-но-установит-переменную] Boid b = boids[i]; ^
@clankill3r, 👍0
Обсуждение1 ответ
C++ — это не Java. Вы не можете просто так назначать структуры — он их копирует (если что).
Boid b = boids[I]; // <<<<<<<<<<<<< this line!
b.start_animate_time = 456;
Вместо этого просто получите прямой доступ к срезу массива:
boids[i].start_animate_time = 456;
И позже:
Serial.println(boids[i].start_animate_time);
По сути, вы создаете переменную "Boid" с именем "b", копируете в нее содержимое boids[i]
, устанавливаете значение в этой переменной, а затем выбрасываете ее. Отсюда и "не используется". Если вы хотите сослаться на определенный фрагмент массива как на отдельную переменную, либо получите указатель на него:
Boid *b = &boids[i];
b->start_animate_time = 456;
Или используйте ссылку:
Boid &b = boids[i];
b.start_animate_time = 456;
Из этих двух вариантов я предпочитаю использовать указатель, но у меня есть опыт работы с C, и я понимаю указатели, но мне потребовались многие годы проб и ошибок, чтобы прийти к этому...
Спасибо, у меня всегда возникали трудности со ссылками и указателями, поскольку у меня не было опыта работы с ними., @clankill3r
Или вы можете использовать некоторые возможности C++11: for (auto & boid : boids) { boid.start_animate_time = 456; Serial.println(boid.start_animate_time); }
(два цикла здесь вообще не нужны), @KIIV
@KIIV Действительно - хотя будьте осторожны с auto
- похоже, значение меняется от версии C++ к версии C++. Как будто они не могут решить, для чего это., @Majenko
- Сохранение файла .txt на SD-карту и чтение данных каждого содержимого в файл txt, а затем сохранение его в переменной
- Объявленная переменная внутри void setup не видится в void loop
- Хранить переменную?
- Сбросить переменную каждую 1 секунду на Arduino.
- Глобальный или локальный
- Использование переменной для индексации массива
- Использование одной и той же переменной между операторами if в loop()
- Функция управления сервоприводами
Я получаю
Символ 'I' не может быть разрешен
. ИзменитеI
наi
., @Juraj@Jurai Понятия не имею, как это стало заглавной буквой, так как я скопировал и вставил весь код. Думаю, это автокоррекция Safari, которая произошла после того, как я добавил
// <<<<<<<<<<<<< эта строка!
Поскольку это единственное, что я добавил в браузере., @clankill3r