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.
- Details
- Hits: 582