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

2
  • I get Symbol 'I' could not be resolved. Change I to i.
    – Juraj
    Jun 19, 2018 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, 2018 at 13:18

1 Answer 1

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...

3
  • Thanks, I always struggle with references and pointers since my lack of experience with them.
    – clankill3r
    Jun 19, 2018 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, 2018 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, 2018 at 15:56

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

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