1

I created a class inside the sketch file(not in another file) and init it as object before setup() and loop() as a global object, after I change some parameters inside the object in setup() , I found in loop() the parameters in the global object remain unchanged. Here is the pseudocode code to describe my question:

//all of the code below are in the same ino file.
class Animal{
public:
  bool alive = false; 
  Animal (bool liveStatus){
    alive = liveStatus;
  }
}

Animal dog(false);
Animal cat(false);
Animal lion(false);
Animal animalArray(dog,cat,lion);




void setup(){

  for (int i=0;i<3;i++){
    Animal current_animal = animalArray[i];
    current_animal.alive = true;
  }
  //here when I print each animal's alive flag is 'true'
}

void loop(){
  for (int i=0;i<3;i++){
         // here the alive flag of each animal is still false  , they should be all true!!
  }

}

It looks like after I quit setup() somehow every change of the global object inside the setup are all gone .

Thanks for helping me ..

  • I can't replicate this error. Can you post the whole code you were uploading before with the print statements and everything? – BrettAM Apr 28 '15 at 0:57
  • Hi BreetAm , the original code is relative complex and long(about 600 lines ) ,post to here won't be a good idea .. is that kind of codes works for you ? – Yank Apr 28 '15 at 2:01
  • Its great that you've tried to keep the example minimal, but in this case you also seem to have removed the source of your problem. Maybe you can pair down you code while constantly testing for the error and seeing how small you can make it without causing dog's value to reset? – BrettAM Apr 28 '15 at 2:04
  • Thanks BrettAM, I am currently doing more test on it , I will push a better example tomorrow and notify you :) – Yank Apr 28 '15 at 2:12
  • Hi BrettAM, sorry I didn't mentioned that I use array in my code . I've edited the example could you check it out please? :) Thanks... – Yank Apr 28 '15 at 2:20
1

Your problem here is that Animal current_animal = animalArray[i]; is making a whole new Animal object that starts as a copy of animalArray[i];, but after that the two are no longer associated. Then when you call current_animal.alive = true;, you are not actually changing the animal in animalArray[i] anymore.

The simplest way to fix this is to make current_animal a reference to the object you pick out of the array, although a pointer would work the same way. With this code:

Animal& current_animal = animalArray[i];
current_animal.alive = true;

current_animal becomes a reference to animalArray[i], instead of a copy. Then operating on current_animal changes the same data that is stored in animalArray[i] like you intend.

  • Thanks BrettAM for your kindness help , this solution saved my day .This problem should be very common on C or C++ languages which involve with pointer stuff , such a shame I just forgot it even I was a computer science student .. Thank you! – Yank Apr 28 '15 at 3:30

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.