0

I got the following error:

warning: variable 'b' set but not used.

I think I do a really small thing wrong but I can't figure out what it is.

#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]; // <<<<<<<<<<<<< this line!
    b.start_animate_time = 456;
  } 


  for (int i = 0; i < array_size(boids); i++) {
    Boid b = boids[i];
    Serial.println(b.start_animate_time); // BUG always 0
  }
}


void loop() {

}

flock_01_ino_debug.ino:28:10: warning: variable 'b' set but not used [-Wunused-but-set-variable] Boid b = boids[i]; ^

  • I get Symbol 'I' could not be resolved. Change I to i. – Juraj Jun 19 '18 at 9:31
  • @Jurai No idea how that became a capital since I copied pasted all code. I guess it is a safari auto correct that happened after I added // <<<<<<<<<<<<< this line! Since that is the only thing I added in the browser. – clankill3r Jun 19 '18 at 13:18
2

C++ is not Java. You can't just assign structs like that - it copies them (if anything).

Boid b = boids[I]; // <<<<<<<<<<<<< this line!
b.start_animate_time = 456;

Instead just access the array slice directly:

boids[i].start_animate_time = 456;

And later on as well:

Serial.println(boids[i].start_animate_time);

Basically, you create a "Boid" variable called "b", copy the content of boids[i] to it, set a value in that variable, and then throw it away. Hence the "not used". If you want to reference a specific array slice as a separate variable either get a pointer to it:

Boid *b = &boids[i];
b->start_animate_time = 456;

Or use a reference:

Boid &b = boids[i];
b.start_animate_time = 456;

Of the two I prefer using a pointer, but I come from a C background and understand pointers, but it took me many years of trial and error to get to that point...

|improve this answer|||||
  • Thanks, I always struggle with references and pointers since my lack of experience with them. – clankill3r Jun 19 '18 at 13:24
  • 1
    Or you can use some C++11 features: for (auto & boid : boids) { boid.start_animate_time = 456; Serial.println(boid.start_animate_time); } (two loops are not needed here at all) – KIIV Jun 19 '18 at 15:13
  • @KIIV Indeed - though be careful using auto - the meaning seems to change from C++ version to C++ version. Like they can't make their mind up what it's for. – Majenko Jun 19 '18 at 15:56

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service, privacy policy and cookie policy

Not the answer you're looking for? Browse other questions tagged or ask your own question.