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]; ^
1 Answer 1
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– clankill3r2018年06月19日 13:24:24 +00:00Commented Jun 19, 2018 at 13:24
-
1Or 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– KIIV2018年06月19日 15:13:15 +00:00Commented 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– Majenko2018年06月19日 15:56:52 +00:00Commented Jun 19, 2018 at 15:56
Symbol 'I' could not be resolved
. ChangeI
toi
.// <<<<<<<<<<<<< this line!
Since that is the only thing I added in the browser.