Options |
EXIT(Name) - end loops - v47.24
> EXIT(name); // exit nested loops up to and including loop
with name
Examples:
> LOOP(lp1,FOREVER){ CALC(x,y,z,"+"); IF(x=5?[EXIT(lp1);]); } // exit loop when
x=5
Note, if the name provided in the EXIT(name); command does not exist in the
current loop nesting, then all loops
and functions are exited up to the top level. It is not possible to exit the
page loop in this way.
Precautions when using LOOP() including "Array Error - Subscript Out Of
Range" message
At the start
of each pass through a loop, a check is performed to see if a touch
screen key is being pressed and, if it is, then the associated touch key
function is called. Caution must be observed with the touch key function
to not modify variables that are being used within the loop otherwise
undesired results can occur which can be difficult to spot or result in
an error message.
Good coding practice
> Make sure variables used in a loop are not modified from a touch key
function (unless this is a desired action)
> If a variable does need to be changed then set a 'flag' in the key
function and test the flag in the page loop and make the change there
instead.
|
Example |
LOOP(MyLoop,12){SHOW(Page1);WAIT(100);SHOW(page2);WAIT(100);}
//repeat 12 times
LOOP(MyLoop,FOREVER) {SHOW(Page1);WAIT(100);SHOW(page2);WAIT(100);}
Loop Example 1
FUNC(fn1)
{
VAR(ii,0,U8);
VAR(jj,0,U8);
VAR(kk,0,U8);
LOOP(lp0,10)
{
LOOP(lp1,10)
{
LOOP(lp2,10)
{
LOAD(RS2,ii,",",jj,",",kk,"\\0d");
CALC(kk,kk,1,"+");
}
CALC(jj,jj,1,"+");
}
CALC(ii,ii,1,"+");
}
LOAD(RS2,"\\0d");
}
RS2 Outputs:
0,0,0\\0d0,0,1\\0d\\0,0,2\\0d...9,9,9\\0d<\\0d
Loop Example 2
KEY(k0,[LOOP(klp,10){LOAD(RS2,"*");}LOAD(rs2,"\\0d\\0a");],480,136,TOUCH);
RS2 outputs on key
press: **********\\0d\\0a
Restriction: If the LOOP() command is within a function called from a KEY() command then further key presses will be ignored.
Each touch key press function must be processed to completion before another can be processed.
Please refer to the project example 'keyboard' for the technique to process keys.
Example 1 - Variables:
VAR( varX, 0, U8 );
// We have a simple function...
FUNC( fnTest1 )
{
LOAD( varX, 0 );
LOOP( lpTest1, 10 )
{
// [Touch Keys are effectively tested here]
LOAD( RS2, varX );
CALC( varX, varX, 1, "+" );
}
}
// In a page we have...
KEY( kyTest1, [ LOAD( varX, 0 ); ], 100, 100, TOUCH );
// Normally we would get 0123456789 sent out of the RS2 port each time
fnTest1 is run
// If however the key kyTest1 is pressed when the loop is being run
then the output may be changed to 0123012345!
Example 2 - Arrays:
VAR( varArr, 0, U8, 5 );
VAR( varY, 0, U8 );
// We have another simple function...
FUNC( fnTest2 )
{
LOAD( varY, 0 );
LOOP( lpTest2, 5 )
{
// [Touch Keys are effectively tested here]
LOAD( RS2, varArr.varY );
CALC( varY, varY, 1, "+" );
}
}
// In a page we have...
KEY( kyTest2, [ LOAD( varY, 0 ); ], 100, 100, TOUCH );
KEY( kyTest3, [ LOAD( varY, 3 ); ], 100, 100, TOUCH );
// Normally we would get the contents of varArr.0 varArr.1 varArr.2
varArr.3 varArr.4 sent out of the RS2 port each time fnTest2 is run
// If however the key kyTest2 is pressed when the loop is being run
then the output may be changed to varArr.0 varArr.1 varArr.0 varArr.1
varArr.2!
// Or, an error when kyTest3 is pressed giving varArr.0 varArr.1
varArr.3 varArr.4 ** Array Error - Subscript Out Of Range ** (ie
varArr.5 doesn't exist!)
|