Using GOTO

I do not like or approve of using GOTO in a program, but I do wish to use it to do some debugging in a program with a long run time. Unfortunately it seems to not be working as indicated in the reference.

Here is the code directly from the sample in the description:

void setup() {
  // put your setup code here, to run once:

}

void loop() 
{
    
    for(byte r = 0; r < 255; r++)
    {
        for(byte g = 255; g > -1; g--)
        {
            for(byte b = 0; b < 255; b++)
            {
                if (analogRead(0) > 250){ goto bailout;}
                // more statements ... 
            }
        }
    }
}

bailout:

Here is the compile and the error messages:

Arduino: 1.8.2 (Windows 10), Board: "Arduino/Genuino Uno"

D:\Program Files (x86)\Arduino\arduino-builder -dump-prefs -logger=machine -hardware D:\Program Files (x86)\Arduino\hardware -tools D:\Program Files (x86)\Arduino\tools-builder -tools D:\Program Files (x86)\Arduino\hardware\tools\avr -built-in-libraries D:\Program Files (x86)\Arduino\libraries -libraries C:\Users\profb\OneDrive\Documents\Arduino\libraries -fqbn=arduino:avr:uno -vid-pid=0X2A03_0X0043 -ide-version=10802 -build-path C:\Users\profb\AppData\Local\Temp\arduino_build_466245 -warnings=default -build-cache C:\Users\profb\AppData\Local\Temp\arduino_cache_490649 -prefs=build.warn_data_percentage=75 -prefs=runtime.tools.avr-gcc.path=D:\Program Files (x86)\Arduino\hardware\tools\avr -prefs=runtime.tools.avrdude.path=D:\Program Files (x86)\Arduino\hardware\tools\avr -prefs=runtime.tools.arduinoOTA.path=D:\Program Files (x86)\Arduino\hardware\tools\avr -verbose C:\Users\profb\OneDrive\Documents\Arduino\bailout_example\bailout_example.ino
D:\Program Files (x86)\Arduino\arduino-builder -compile -logger=machine -hardware D:\Program Files (x86)\Arduino\hardware -tools D:\Program Files (x86)\Arduino\tools-builder -tools D:\Program Files (x86)\Arduino\hardware\tools\avr -built-in-libraries D:\Program Files (x86)\Arduino\libraries -libraries C:\Users\profb\OneDrive\Documents\Arduino\libraries -fqbn=arduino:avr:uno -vid-pid=0X2A03_0X0043 -ide-version=10802 -build-path C:\Users\profb\AppData\Local\Temp\arduino_build_466245 -warnings=default -build-cache C:\Users\profb\AppData\Local\Temp\arduino_cache_490649 -prefs=build.warn_data_percentage=75 -prefs=runtime.tools.avr-gcc.path=D:\Program Files (x86)\Arduino\hardware\tools\avr -prefs=runtime.tools.avrdude.path=D:\Program Files (x86)\Arduino\hardware\tools\avr -prefs=runtime.tools.arduinoOTA.path=D:\Program Files (x86)\Arduino\hardware\tools\avr -verbose C:\Users\profb\OneDrive\Documents\Arduino\bailout_example\bailout_example.ino
Using board 'uno' from platform in folder: D:\Program Files (x86)\Arduino\hardware\arduino\avr
Using core 'arduino' from platform in folder: D:\Program Files (x86)\Arduino\hardware\arduino\avr
Detecting libraries used...
"D:\Program Files (x86)\Arduino\hardware\tools\avr/bin/avr-g++" -c -g -Os -w -std=gnu++11 -fpermissive -fno-exceptions -ffunction-sections -fdata-sections -fno-threadsafe-statics  -flto -w -x c++ -E -CC -mmcu=atmega328p -DF_CPU=16000000L -DARDUINO=10802 -DARDUINO_AVR_UNO -DARDUINO_ARCH_AVR   "-ID:\Program Files (x86)\Arduino\hardware\arduino\avr\cores\arduino" "-ID:\Program Files (x86)\Arduino\hardware\arduino\avr\variants\standard" "C:\Users\profb\AppData\Local\Temp\arduino_build_466245\sketch\bailout_example.ino.cpp" -o "nul"
Generating function prototypes...
"D:\Program Files (x86)\Arduino\hardware\tools\avr/bin/avr-g++" -c -g -Os -w -std=gnu++11 -fpermissive -fno-exceptions -ffunction-sections -fdata-sections -fno-threadsafe-statics  -flto -w -x c++ -E -CC -mmcu=atmega328p -DF_CPU=16000000L -DARDUINO=10802 -DARDUINO_AVR_UNO -DARDUINO_ARCH_AVR   "-ID:\Program Files (x86)\Arduino\hardware\arduino\avr\cores\arduino" "-ID:\Program Files (x86)\Arduino\hardware\arduino\avr\variants\standard" "C:\Users\profb\AppData\Local\Temp\arduino_build_466245\sketch\bailout_example.ino.cpp" -o "C:\Users\profb\AppData\Local\Temp\arduino_build_466245\preproc\ctags_target_for_gcc_minus_e.cpp"
"D:\Program Files (x86)\Arduino\tools-builder\ctags\5.8-arduino11/ctags" -u --language-force=c++ -f - --c++-kinds=svpf --fields=KSTtzns --line-directives "C:\Users\profb\AppData\Local\Temp\arduino_build_466245\preproc\ctags_target_for_gcc_minus_e.cpp"
Compiling sketch...
"D:\Program Files (x86)\Arduino\hardware\tools\avr/bin/avr-g++" -c -g -Os  -std=gnu++11 -fpermissive -fno-exceptions -ffunction-sections -fdata-sections -fno-threadsafe-statics -MMD -flto -mmcu=atmega328p -DF_CPU=16000000L -DARDUINO=10802 -DARDUINO_AVR_UNO -DARDUINO_ARCH_AVR   "-ID:\Program Files (x86)\Arduino\hardware\arduino\avr\cores\arduino" "-ID:\Program Files (x86)\Arduino\hardware\arduino\avr\variants\standard" "C:\Users\profb\AppData\Local\Temp\arduino_build_466245\sketch\bailout_example.ino.cpp" -o "C:\Users\profb\AppData\Local\Temp\arduino_build_466245\sketch\bailout_example.ino.cpp.o"
C:\Users\profb\OneDrive\Documents\Arduino\bailout_example\bailout_example.ino: In function 'void loop()':

bailout_example:15: error: label 'bailout' used but not defined

                 if (analogRead(0) > 250){ goto bailout;}

                                                ^

C:\Users\profb\OneDrive\Documents\Arduino\bailout_example\bailout_example.ino: At global scope:

bailout_example:22: error: 'bailout' does not name a type

 bailout:

 ^

exit status 1
label 'bailout' used but not defined

Am I misunderstanding the reference, doing something wrong, or is the reference information incorrect?

The bailout: label is outside the loop() function.

You could easily write that code to use a flag so that the goto wasn't necessary.

Pete

You can not jump out of a function using goto. As el_supremo says, goto is quite unnecessary.

bool carryOn = true;

    for(byte r = 0; r < 255 && carryOn; r++)
    {
        for(byte g = 255; g > -1 && carryOn; g--)
        {
            for(byte b = 0; b < 255 && carryOn; b++)
            {
                if (analogRead(0) > 250)
                {
                   carryOn = false;
                }

g will ALWAYS be greater than -1.

Another problem is that "r < 255" and "b < 255" will prevent processing of the cases where r or b are equal to 255.

Pete

What everyone else said.

If you want to use a byte to iterate from 0 to 255, the only thing that will work (without extra variables) is a while-do loop:

byte b = 0;

do {
  // do something with b
} while(++b != 0);

I started programming in 1975 (Mainframes, in assembly language). I stopped using "goto" in about 1978 when I learnt my first high-level language (COBOL). In my - somewhat jaded - opinion there is NEVER any reason in the modern age to even think about using one. No doubt I will get flamed by some purist citing a once-in-a-lifetime edge case...but I have spent the majority of my life earning a pretty good living programming without ever having needed one since the late '70s.

There are so many better ways. To be honest I had even forgotten you could actually use one!