Wanneer BBC BASIC for Windows een FOR, REPEAT, WHILE, GOSUB, FN of een PROC statement tegenkomt, moet hij kunnen weten waar hij in het programma zit, zodat het terug kan bij een NEXT, UNTIL, ENDWHILE of RETURN statement of wanneer het einde van een procedure of een functie wordt bereikt. Dit adres vertelt BBC BASIC for Windows waar het in uw programma is.

Elke keer wanneer BBC BASIC for Windows een FOR, REPEAT, WHILE, GOSUB, FN of PROC statement bereikt, wordt er een adres in een stack geplaatst en elke keer als het een NEXT, UNTIL, ENDWHILE of een RETURN statement of het einde van een functie of procedure bereikt, wordt het laatste adres 'gepakt' van de stack en gaat de besturing daar terug.

Afgezien van de grootte van het systeemgeheugen is er geen limiet op het niveau van geneste FOR ... NEXT, REPEAT... UNTIL, WHILE ... ENDWHILE en GOSUB ... RETURN operaties. De niet af te vangen foutbericht 'No room' zal worden afgegeven als alle ruimte in de stack is opgebruikt.

Programmastructuurbeperkingen

Het gebruik van een gemeenschappelijke stack heeft een nadeel (als het een nadeel is) in de zin dat het dwingt strikte naleving te volgen van een goede programmastructuur. Het is praktisch niet goed een FOR ... NEXT lus te verlaten zonder het NEXT statement te passeren; het maakt het programma moeilijker te begrijpen. Dit geldt ook bij het verlaten van een REPEAT ... UNTIL lus of een GOSUB ... RETURN structuur. Het nadeel wordt bedoeld dat, als u een FOR ... NEXT lus verlaat zonder het uitvoeren van het NEXT statement en dan bijvoorbeeld een ENDWHILE statement wordt bereikt, BBC BASIC for Windows een fout rapporteert (in dit geval een 'Not in a WHILE loop' fout). Het voorbeeld onderaan resulteert een foutmelding 'Not in a REPEAT loop at line 460'.

400 REPEAT
410    INPUT ' "Bij welk nummer moet het stoppen", num
420    FOR i=1 TO 100
430        PRINT i;
440        IF i=num THEN 460
450    NEXT i
460 UNTIL num=-1

Programmalussen verlaten

Er zijn verschillende manieren om een programmalus te verlaten die niet strijdig zijn met de noodzaak om netjes programmastructuren te schrijven. Deze worden hieronder uitgelegd:

REPEAT ... UNTIL lussen
Om het verlaat-probleem van een FOR ... NEXT lus te overwinnen is om het te herstructureren naar een REPEAT ... UNTIL lus. Het voorbeeld hieronder voert dezelfde functie uit als het vorige voorbeeld, maar het verlaat de structuur goed. Het heeft als extra voordeel meer duidelijkheid over de voorwaarden waaraan de lus moet worden beëindigd (en het vereist geen regelnummers):

REPEAT
    INPUT ' "Bij welk nummer moet het stoppen", num
    i=0
    REPEAT
        i=i+1
        PRINT i;
    UNTIL i=100 OR i=num
UNTIL num=-1

De lus variabele wijzigen
Een andere manier om voortijdig een lus te verlaten is door de lus variabele een waarde aan toe te kennen die gelijk moet zijn aan de grenswaarde. Voor een uitwijkmogelijkheid kunt u de lus variabele instellen op een hogere waarde dan de limiet (ervan uitgaande dat de stap positief is). In dit geval is de waarde bij afsluiten afhankelijk van waarom de lus werd beëindigd (in sommige gevallen zou dit een voordeel kunnen zijn). In het onderstaand voorbeeld wordt deze methode gebruikt om de lus te verlaten:

REPEAT
    INPUT ' "Bij welk nummer moet het stoppen", num
    FOR i=1 TO 100
        PRINT i;
        IF i=num THEN
            i=500
        ELSE
            REM Meer code hier indien nodig
        ENDIF
    NEXT
UNTIL num=-1

Het EXIT statement gebruiken
U kunt de EXIT FOR statement gebruiken voor hetzelfde effect als het eerste voorbeeld, zonder gebruik te moeten maken van GOTO:

REPEAT
    INPUT ' "Bij welk nummer moet het stoppen", num
    FOR i=1 TO 100
        PRINT i;
        IF i=num THEN EXIT FOR
        REN Meer code hier indien nodig
    NEXT i
UNTIL num=-1

Een lus uitvoeren in een procedure
Een radicaal andere benadering is het verplaatsen van de lus in een gebruiker gedefinieerde procedure of functie. Hiermee kunt u rechtstreeks uit de lus springen:

DEF PROCloop(num)
    LOCAL i
    FOR i=1 TO 100
        PRINT i;
        IF i=num THEN ENDPROC
        REM Meer code hier indien nodig
    NEXT i
ENDPROC

Als u wilt weten of de lus voortijdig was gestopt, kunt u een andere waarde retourneren:

DEF FNloop(num)
    LOCAL i
    FOR i=1 TO 100
        PRINT i;
        IF i=num THEN =TRUE
        REM Meer code hier indien nodig
    NEXT i
=FALSE

Omdat lokale variabelen ook opgeslagen zijn op de stack, kunt u geen gebruik maken van een FOR ... NEXT lus die een lokale array maakt. Als voorbeeld, het volgende programma zal de foutmelding 'Not in a FN or PROC' geven:

DEF PROC_error_demo
    FOR i=0 TO 10
        LOCAL data(i)
    NEXT
ENDPROC

Gelukkig mag in BBC BASIC for Windows wel een array 'local' worden gemaakt op de volgende manier:

DEF PROC_error_demo
    LOCAL data()
    DIM data(10)
ENDPROC

Let op het gebruik van de haakjes openen en sluiten met niets ertussen.