Go Down

Topic: WHich loop to use and when? do/while, for, else, if else, while, goto (Read 213 times) previous topic - next topic

Doug101

Trying to figure out which loop to use.  I've read the Arduino reference, so in theory i get it.  But what I'm after are simple examples.

Can someone point me to where I can find some simple examples comparing the different loops and why and when to use one loop command instead of another.

Thanks

septillion

First the simple one, just never use goto ;)

Next up, most loops can be transformed into each other but it might be handy to use a particular form.

For example, if you want to check if the outcome of some test is within limits it would be logical to use a do-while loop. Because he, you need to at least do the stuff one to know the outcome.

But if you want to loop over a set of unknown length, it's pretty stupid to first do something and only check afterwards. So while() or for() is more logical. Especially for() if you need to initiate something before you start (like a loop variable).

If, else and if else has nothing to do with looping ;) It just decides if you want to do something or not ;)
Use fricking code tags!!!!
I want x => I would like x, I need help => I would like help, Need fast => Go and pay someone to do the job...

NEW Library to make fading leds a piece of cake
https://github.com/septillion-git/FadeLed

Doug101

First the simple one, just never use goto ;)

Next up, most loops can be transformed into each other but it might be handy to use a particular form.

For example, if you want to check if the outcome of some test is within limits it would be logical to use a do-while loop. Because he, you need to at least do the stuff one to know the outcome.

But if you want to loop over a set of unknown length, it's pretty stupid to first do something and only check afterwards. So while() or for() is more logical. Especially for() if you need to initiate something before you start (like a loop variable).

If, else and if else has nothing to do with looping ;) It just decides if you want to do something or not ;)
Thanks

I understand GoTo is not ideal, so how do I exit a loop that would take two different conditions?

Something like
Loop

Check to see if push button has been pressed.
If PB = High and Pin output = low exit go to routine A
If PB = High and Pin output = HIGH exit go to routine B
If no button press contine loop looking for button press.


GoTo would work, but what's better?













johnwasser

The 'for' loop exists because the following is a very common construct:
Code: [Select]
   int i = 0;  // Initialize the loop variable
    while (i < loopLimit) {  // Test for end of loop
        // Do Stuff
        i++;  // Increment loop varaible
    }  // End of loop body


It is much easier to write (and read!)  it it is all on one line:
Code: [Select]
   for (int i = 0; i < loopLimit; i++) {
        // Do Stuff
    }  // End of loop body

If your loop looks much like the 'while' above you probably should have used the 'for'.
Send Bitcoin tips to: 1G2qoGwMRXx8az71DVP1E81jShxtbSh5Hp

johnwasser

Code: [Select]
void loop()
{
    boolean PB = digitalRead(PushButtonPin);
    if (PB)
    {
        if (PinOutput == LOW) 
            routineA();
        else
            routineB();
    }
}
Send Bitcoin tips to: 1G2qoGwMRXx8az71DVP1E81jShxtbSh5Hp

septillion

You don't need to exit it, you just temperately jump out of it

So:
Check to see if push button has been pressed.
If (PB = High and Pin output = low) exit go to routine run function A
else If PB = High and Pin output = HIGH exit go to routine run function B
If no button press contine loop looking for button press.

And the continues looping is already done by loop() :)
Use fricking code tags!!!!
I want x => I would like x, I need help => I would like help, Need fast => Go and pay someone to do the job...

NEW Library to make fading leds a piece of cake
https://github.com/septillion-git/FadeLed

Robin2

Another thing to keep in mind is NOT to use FOR or WHILE loops if they take any appreciable time to complete - anything more than 100 microsecs or thereabouts - as they block the Arduino from doing other things until they complete.

If you need to repeat something that takes longer then just allow loop() to do the repetition and test the condition with IF

...R
Two or three hours spent thinking and reading documentation solves most programming problems.

BulldogLowell

Can someone point me to where I can find some simple examples comparing the different loops and why and when to use one loop command instead of another.
this guy explains loops and then in the next video, he explains control flow statements.

the series is great...

GolamMostafa

Let us see some codes on the applications of loop command with reference to the following diagram.


Program codes to check that the button K1 of the above circuit has been closed and then turn-non (ignite) L (built-in LED of UNO).

1.  Using Flow Chart


2. Using goto statement
Code: [Select]
void setup()
{
  pinMode(13, OUTPUT);      //IO line of DPin-13 will work as output line
  pinMode(2, INPUT_PULLUP); //IO line of DPin-2 will work as input with internal pull-up
  digitalWrite(13, LOW);  //initially L is OFF
  
  L1: bool statusK1 = digitalRead(2); //reading ope/close status of K1
  if (statusK1 == LOW)            //K1 is closed
  {
    digitalWrite(13, HIGH);       //ignite L
    while(1);                     //wait here for ever; there is no halt instruction for AVR?
  }
  else
  {
    goto L1;                      //K1 is not closed
  }
}

void loop()
{
  
}


3.  Using do-while Structure
Code: [Select]
void setup()
{
  pinMode(13, OUTPUT);      //IO line of DPin-13 will work as output line
  pinMode(2, INPUT_PULLUP); //IO line of DPin-2 will work as input with internal pull-up
  digitalWrite(13, LOW);  //initially L is OFF

  do
  {
    ;
  }
  while(digitalRead(2)!=LOW);
  digitalWrite(13, HIGH);       //ignite L
}

void loop()
{
  
}


4.  Using while-do Structure
Code: [Select]
void setup()
{
  pinMode(13, OUTPUT);      //IO line of DPin-13 will work as output line
  pinMode(2, INPUT_PULLUP); //IO line of DPin-2 will work as input with internal pull-up
  digitalWrite(13, LOW);  //initially L is OFF

  while(digitalRead(2)!=LOW)
    ;
  digitalWrite(13, HIGH);       //ignite L
}

void loop()
{
  
}


5.  Using for() Loop
Code: [Select]
void setup()
{
  pinMode(13, OUTPUT);      //IO line of DPin-13 will work as output line
  pinMode(2, INPUT_PULLUP); //IO line of DPin-2 will work as input with internal pull-up
  digitalWrite(13, LOW);  //initially L is OFF

  for (; digitalRead(2)==HIGH; )
  {
    ;
  }
  digitalWrite(13, HIGH);       //ignite L
}

void loop()
{
  
}

Go Up