RUBRICA “MSX BASIC” a cura di Orazio Cacciola (parte 11)
GOSUB/RETURN/ON GOSUB/ON GOTO/INKEY$
In questa puntata parlerò dei comandi per richiamare delle subroutine da qualsiasi punto del nostro programma, come usarli quando le scelte sono molteplici e come inserire un carattere da tastiera.
GOSUB
Manda il programma ad una subroutine, al termine di essa ritornerà alla istruzione successiva. È un comando simile al GOTO, in entrambi i casi manda l’esecuzione alla linea che segue subito dopo il comando. C’è però una differenza tra i due, mentre il primo dopo aver fatto il “salto” prosegue normalmente, il secondo memorizza la posizione dove è avvenuto il salto. Questo vuol dire che il BASIC tiene in memoria, ogni GOSUB che incontra, infatti possiamo usare tutti i GOSUB che vogliamo, ricordiamoci che la memoria del BASIC non è tanta, più ne useremo e più questa diminuirà.
SINTASSI: GOSUB Numero di Linea
RETURN
Comando che serve a chiudere la routine chiamata con GOSUB. Ogni GOSUB deve avere un RETURN. Infatti il RETURN oltre rimandare l’esecuzione del programma
all’istruzione successiva al GOSUB, libera la memoria. Possiamo anche decidere di non fare ritornare il programma alla linea successiva al GOSUB, aggiungendo un numero di linea.
SINTASSI: RETURN [Numero di Linea]
ON GOSUB
Viene usato quando i sottoprogrammi sono più di uno e dobbiamo scegliere quale eseguire. Ammettiamo di voler creare un programma con 3 subroutine che verranno eseguite assecondo della scelta fatta: ON C GOSUB 100,200,300. Il comando deve avere sempre una variabile, è quella che decide dove mandare l’esecuzione. Questa ultima eseguirà le 3 subroutines se avrà il valore tra 1 e 3. Possiamo dire che i numeri di linea verranno eseguite in modo crescente, perciò la C = 1 manderà il programma alla linea 100, C = 2 alla 200 e C = 3 alla 300. Più sono le subroutine e più aumenterà la variabile usata. Se invece la variabile C è uguale a 0, ha valore negativo oppure supera il numero delle linee del comando, nel nostro caso 4 o superiori, non succede nulla. Il comando viene saltato proprio come succede con una funzione IF/THEN quando non si verifica la condizione.
SINTASSI: ON Variabile GOSUB Numero di linea, [Numero di linea], …….
ON GOTO
Ha le stesse funzionalità del ON GOSUB è vale tutto quello che ho detto sopra, ma come sappiamo, il GOTO crea il salto incondizionato e nient’altro. Per essere rieseguito si dovrà usare un altro GOTO.
INKEY$
Accetta qualsiasi carattere che viene premuto dalla tastiera quanto il programma incontra questa funzione. Se in quel momento non viene premuto nulla, riporta una stringa vuota. Può contenere solo un carattere. È consigliabile usarla sempre con delle condizioni (IF/THEN/ELSE) un buono risultato quando dobbiamo fare una scelta e non vogliamo che visualizzi nulla sullo schermo. Può essere usata singolarmente oppure dentro una variabile. Di seguito un piccolo programma d’esempio.
100 A$=INKEY$: IF A$="" THEN 100 PRINT "SCEGLI SI/NO" 110 IF A$="S" OR A$="s" THEN 10 120 IF A$="N" OR A$="n" THEN CLS: END ELSE 100
Come ho fatto la volta scorsa, ho creato un piccolo programma per fare capire meglio.
10 DEFINT A-Z: SCREEN 0 20 CLS:LOCATE 15,1: PRINT "M E N U": GOSUB 100 30 S$=INKEY$: IF S$="" THEN 30 40 IF S$<"1" OR S$>"4" THEN 30 50 ON VAL(S$) GOSUB 200,300,400,500 60 GOTO 30 100 LOCATE 1,4 : PRINT"1 - INSERIMENTO DATI" 110 LOCATE 1,8 : PRINT"2 - MODIFICA DATI" 120 LOCATE 1,12: PRINT"3 - VISUALIZZA DATI" 130 LOCATE 1,20: PRINT"4 - USCITA PROGRAMMA" 140 RETURN 200 CLS: LOCATE 12,0: PRINT "INSERIMENTO" 210 LOCATE 1,4:INPUT "NOME";N$ 220 LOCATE 1,8: INPUT "INDIRIZZO";I$ 230 LOCATE 1,12:INPUT "IMPORTO";IM 240 LOCATE 1,18: PRINT "CORRETTO (S/N)?" 250 S$=INKEY$: IF S$="" THEN 250 260 IF S$="s" OR S$="S" THEN RETURN 20 270 IF S$="N" OR S$="N" THEN 200 ELSE 250 300 CLS:LOCATE 15,0: PRINT "MODIFICA" 310 LOCATE 0,4:INPUT "NOME(Confermare per non cambiare)";N1$ 320 IF N1$="" THEN LOCATE 1,29:PRINT N$ ELSE N$=N1$ 330 LOCATE 0,8: INPUT "INDIRIZZO(Confermare per non cambiare)";I1$ 340 IF I1$="" THEN LOCATE 0,9:PRINT I$ ELSE I$=I1$ 350 LOCATE 0,12:INPUT "IMPORTO(Confermare per non cambiare)";IM$ 360 IF IM$="" THEN LOCATE 0,13:PRINT IM ELSE IM=VAL(IM$) 370 CLS:RETURN 400 LOCATE 10,0: PRINT "VISUALIZZAZIONE" 410 LOCATE 1,4: PRINT "NOME :";N$ 420 LOCATE 1,8: PRINT "INDIRIZZO :";I$ 430 LOCATE 1,12: PRINT "IMPORTO :";IM 440 LOCATE 1,18:PRINT "Premere spazio per uscire" 450 IF INKEY$=" " THEN RETURN ELSE 450 500 CLS:END
Non ho usato L’ON GOTO, ma basta cambiare la riga 50 e le varie linee delle subroutines sostituendo il RETURN con GOTO Numero di linea e il gioco è fatto. Il programma è stato fatto in modo semplice per problemi di spazio, ma potete renderlo molto più “presentabile” facendo le vostre modifiche.
Alla prossima, grazie a tutti.



0 commenti