# warning: variable 'b' set but not used

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

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

• Thanks, I always struggle with references and pointers since my lack of experience with them. – clankill3r Jun 19 '18 at 13:24
• 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