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]; ^

, 👍0

Обсуждение

Я получаю Символ 'I' не может быть разрешен. Измените I на i., @Juraj

@Jurai Понятия не имею, как это стало заглавной буквой, так как я скопировал и вставил весь код. Думаю, это автокоррекция Safari, которая произошла после того, как я добавил // <<<<<<<<<<<<< эта строка! Поскольку это единственное, что я добавил в браузере., @clankill3r


1 ответ


2

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