Difference between revisions of "Zbex procedures"
(created page) |
(added chapter navigator at top of page) |
||
(One intermediate revision by the same user not shown) | |||
Line 1: | Line 1: | ||
+ | {{ZbexChap | ||
+ | | before = [[Zbex functions|Functions]] | ||
+ | | after = [[Zbex tables|Tables]] | ||
+ | }} | ||
+ | |||
A procedure is a section of code which can be entered (called) from different points in a program and which, when completed, will return control to the calling point. Procedures may call other procedures, but Zbex is not designed for recursive procedure calls (that is when a procedure calls itself). The codes for procedures must come after the main program. | A procedure is a section of code which can be entered (called) from different points in a program and which, when completed, will return control to the calling point. Procedures may call other procedures, but Zbex is not designed for recursive procedure calls (that is when a procedure calls itself). The codes for procedures must come after the main program. | ||
Line 187: | Line 192: | ||
return | return | ||
run | run | ||
+ | |||
+ | |||
+ | |||
+ | |||
+ | {{ZbexChap | ||
+ | | before = [[Zbex functions|Functions]] | ||
+ | | after = [[Zbex tables|Tables]] | ||
+ | }} |
Latest revision as of 06:24, 15 October 2010
Previous chapter Functions |
Zbex Manual |
Next Chapter Tables |
A procedure is a section of code which can be entered (called) from different points in a program and which, when completed, will return control to the calling point. Procedures may call other procedures, but Zbex is not designed for recursive procedure calls (that is when a procedure calls itself). The codes for procedures must come after the main program.
A procedure is identified by the procedure statement. A procedure is called using the perform statement. Return from a procedure is accomplished with the return statement. Example:
Program --------------------- int i,j loop for i = 1 to 5 perform square putc ~i ~j repeat stop procedure square j = i * i return run
Execution ------------------------------------- ** S=10, P=29, L=235, M=410 ** 1 1 2 4 3 9 4 16 5 25 Ready for program
It is possible to declare variables inside a procedure. Variables so declared can be referenced only within the procedure. If a variable of the same name was declared in the main program, it will be masked (unaccessable) inside the procedure. Example, using the variable i:
Program --------------------- int i,j,k loop for i = 1 to 5 j = i perform factorial putc ~i ~k repeat stop procedure factorial int i k = 1 loop for i = 1 to j k = k * i repeat return run
Execution ------------------------------------- ** S=15, P=41, L=239, M=410 ** 1 1 2 2 3 6 4 24 5 120 Ready for program
It is possible to pass data to a procedure and for a procedure to pass data back to the calling point. The buffers for this must be included in the procedure statement, and the data types for the buffers must be declared inside the procedure. Values must be loaded into the buffer at the time the procedure is called. The actual transfer of data is handled by the getvalue and passback statements inside the procedure. Example:
Program --------------------- int i,j loop for i = 6 to 10 perform factorial (i,j) putc .w2 ~i .t4w8 ~j repeat stop procedure factorial (a,b) int a,b,i getvalue a b = 1 loop for i = 1 to a b = b * i repeat passback b return run
Execution ------------------------------------- ** S=16, P=53, L=241, M=410 ** 6 720 7 5040 8 40320 9 362880 10 3628800 Ready for program
There are times when you will want to return directly to a point in the main program, irrespective of how many levels of procedure calls you have made. An example of this would be a language compiler. If you are processing a line of text and a procedure within a procedure within a procedure identifies a syntax error, you would not want to trace your way back to the main program through these procedures; instead, you would want to jump directly to the error handling portion of the program with a flag telling that portion what went wrong. Zbex provides you a way to do this using the special trp variable and the special trap label. If you include an integer number with a return statement, the record of procedure calls will be erased and control will pass directly to the trap label in the main program. The special integer variable trp will be assigned the value attached to the return statement. Example:
Program --------------------- int i trp = 0 trap: i = 0 perform pro1 stop procedure pro1 putc pro1 ... i = i + 1 if i > trp putc return 1 end perform pro2 putc returning from pro1 return procedure pro2 putc pro2 ... i = i + 1 if i > trp putc return 2 end perform pro3 putc returning from pro2 return procedure pro3 putc pro3 putc returning from pro3 return run
Execution ------------------------------------- ** S=31, P=83, L=233, M=410 ** pro1 pro1 pro2 pro1 pro2 pro3 returning from pro3 returning from pro2 returning from pro1 Ready for program
There are only two ways to interrupt an Zbex program once it has been started. One of these is by pressing Ctrl+Break (the other is by responding to a getc with two exclaimation points (!!)). On occasion you may want Ctrl+Break to actually do something in your Zbex program. For example, if your program is writing to the screen, and you want it to stop, you must push Ctrl+Break. In some cases, you may not want your Zbex program to halt, you may simply want to get control of it. Zbex provides you a means for doing this. It is a special procedure called break. If you include a procedure with this name, control will automatically pass to it when you press Ctrl+Break. A normal return from this procedure will put you back into your Zbex program exactly at the point where Ctrl+Break was pressed. Example:
Program --------------------- int i,j loop for i = 1 to 100000 loop for j = 1 to 300000 /* (for a delay) repeat putc ~i repeat stop procedure break getc return run
Execution ------------------------------------- ** S=11, P=26, L=235, M=410 ** 1 2 3 (here, Ctrl+Break was pressed and a blank line entered) 4 5 !! (here, Ctrl+Break was pressed and !! was entered) Ready for program
There is an important precaution you must observe with the procedure break. You need to provide some mechanism for terminating the program inside the procedure, or else you may not be able to terminate your program at all (except by exiting Dmuse)! The program below, once started, cannot be stopped, except by exiting Dmuse.
int i,j loop i = i + 1 putc ~i repeat stop procedure break return run
Previous chapter Functions |
Zbex Manual |
Next Chapter Tables |