MSX BASIC – lezione 12

da | Nov 20, 2023 | MSX BASIC | 0 commenti

RUBRICA “MSX BASIC” a cura di Orazio Cacciola (parte 12)

LE MATRICI. I COMANDI DIM/ERASE e LE FUNZIONI CLEAR/FRE

È molto scomodo quando dobbiamo fare un programma che faccia uso di tante variabili che verranno usate diverse volte. Pensate ad una sequenza di costanti che vengono richiamati da diversi punti del programma o un archivio con nomi, indirizzi, ecc. Prendiamo come esempio il primo argomento menzionato, le costanti e facciamo finta che il nostro programma ne utilizzerà 20, perciò ci toccherà crearle. Visto che queste variabili avranno la stessa funzionalità, per crearle potremmo usare una variabile che chiameremo C, seguita da un numero. Ad esempio:
C1,C2, C3, C4, e così via. Però sappiamo che il BASIC MSX memorizza solo i primi 2 caratteri delle variabili, perciò visto che le variabili dovranno essere 20, usando il metodo descritto sopra, ci consente di utilizzare fino alla variabile C9 perché la C10 sarà ‘vista’ dal Basic come C1 ed andrà a memorizzare il dato su quell’ultima, cancellando quello precedente. Perciò per proseguire dobbiamo usare un’altra lettera. Pensate che casino. Ma fortunatamente c’è la soluzione a tutto questo. Questa si chiama ARRAY O MATRICI. Le matrici vengono create quasi sempre all’inizio del programma, essi riservano dei cassetti nella memoria dove verranno memorizzati tutti i dati. Siamo noi a dire quanto di questi assetti vogliamo riservare, usando il comando DIM. Facciamo l’esempio di sopra: DIM C(19). Ho messo 19 perché il BASIC MSX comincia a contare da 0. Questo vale anche per le variabili alfanumeriche. Per continuare, sapendo già i dati, visto che sono costanti, possiamo caricarli in una funzione DATA e richiamarli con un ciclo FOR/NEXT.
Faccio un piccolo programma d’esempio.

10 DIM C(19)
20 FOR I=0 TO 19:READ C
30 C(I)=C: NEXT I
40 DATA ..........

Possiamo anche creare matrici a 2 dimensioni, tridimensionali e ancora più grandi, ma visto la poca memoria del nostro MSX sarà proibitivo usare matrici troppo grandi, la memoria si esaurirebbe molto velocemente. Per creare una matrice a 2 dimensioni basta aggiungere un secondo dato seguito da virgola: DIM C(19,3), così facendo abbiamo riservato 80 (20X4) cassettini in memoria. Mentre per una a tre dimensioni, sarà: DIM C(19,3,2). Questa volta saranno ben 240 (20x4x3). La memoria in byte che occupano i cosiddetti cassettini (è un mio modo di chiamarli), varierà assecondo della variabile memorizzata. Se dobbiamo utilizzare una matrice che non superi il 10 cioè gli undici inserimenti, non è obbligatorio inizializzarla con il comando DIM, anche se questa è bidimensionale o superiori. Non possiamo dimensionare una variabile 2 volte, se ciò avviene verrà segnalato come errore, almeno che la stessa non sia stata eliminata con il comando che spiegherò di seguito.

Dopo aver creato una matrice e averla utilizzata fino ad un certo punto del nostro programma, sappiamo che d’ora in avanti non sarà più necessaria oppure alcuni dati non saranno più utili. Possiamo eliminarla, liberando spazio in memoria, usando il comando ERASE. Quest’ultima verrà cancellata insieme a tutti i suoi dati. Nel caso del secondo argomento menzionato sopra, dimensioneremo di nuovo la variabile con i parametri corretti e inseriremo di nuovo i dati che utilizzeremo. Dopo il comando ERASE si dovrà inserire solo il nome della variabile senza il suo dimensionamento. La sintassi corretta è: ERASE Variabile,[Variabile],[Variabile] ……

CLEAR
Azzera tutte le variabili, anche quelle negli array, chiude i file ed elimina le funzioni create con DEF. Modifica lo spazio riservato alle stringhe, per default è 200 (caratteri). Imposta il massimo indirizzo che possa essere usato dal Basic MSX. Può essere usato senza argomenti per fare pulizia nella memoria.

Sintassi: CLEAR [DimensioneMaxStringhe],[IndirizzoMax]
FRE
Questa funzione ci dice quanta memoria libera è disponibile nel Basic. Possiamo anche sapere lo spazio libero riservato alle stringhe. Per sapere quanta memoria libera abbiamo ancora disponibile, basta aggiungere un numero dentro le parentesi tonde: PRINT FRE(0), per le stringhe bastano 2 virgolette: PRINT FRE(“”). Gli argomenti della funzione sono fittizi, la cosa importante è usare un numero per la prima definizione e una stringa per la seconda. Se vogliamo, possiamo inserirla anche dentro una variabile: A = FRE(0)
Sintassi: FRE(0) o FRE(“”)
Come la volta scorsa per riassumere il tutto, mostrerò il programma fatto la puntata precedente, modificato con le nuove funzioni.
10 CLEAR(2000):DEFINT A-Z: SCREEN 0: DIM M$(50,2):CN=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 20
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,16: PRINT"4 - USCITA PROGRAMMA"
140 RETURN
200 IF FRE("")<50 OR CN=50 THEN PRINT "ATTENZIONE !! Non si possono fare più inserimenti": FOR R=0 TO 2000:NEXT R: RETURN ELSE CN=CN+1
205 CLS: LOCATE 12,0: PRINT "INSERIMENTO"
210 LOCATE 1,4: LOCATE 1,4:INPUT "NOME";M$(CN,0)
220 LOCATE 1,8: INPUT "INDIRIZZO";M$(CN,1)
230 LOCATE 1,12:INPUT "TELEFONO"; M$(CN,2)
240 LOCATE 1,18: PRINT "CORRETTO (S/N)?"
250 S$=INKEY$: IF S$="" THEN 250
260 IF S$="s" OR S$="S" THEN RETURN
270 IF S$="N" OR S$="N" THEN 205 ELSE 250
300 CLS:LOCATE 15,0: PRINT "MODIFICA"
303 INPUT "INSERIRE IL NOME DA RICERCARE";N$
306 FOR I=1 TO CN:IF N$=M$(I,0) THEN 310
308 NEXT: PRINT "Nome non trovato":FOR R=0 TO 2000:NEXT: RETURN
310 LOCATE 0,4:INPUT "NOME(Confermare per non cambiare)";N1$
320 IF N1$="" THEN LOCATE 1,29:PRINT M$(I,0) ELSE M$(I,0)=N1$330 LOCATE 0,8: INPUT "INDIRIZZO(Confermare per non cambiare)";I$
340 IF I$="" THEN LOCATE 0,9:PRINT M$(I,1) ELSE M$(I,1)=I$
350 T$=M$(I,2):LOCATE 0,12:INPUT "TELEFONO(Confermare per non cambiare)";T$
360 IF T$="" THEN LOCATE 0,13:PRINT M$(I,2) ELSE M$(I,2)=T$
370 CLS:RETURN
400 CLS:LOCATE 10,0: PRINT "VISUALIZZAZIONE"
410 FOR I=1 TO CN
420 PRINT "NOME:"M$(I,0);TAB(20);"INDIR.";M$(I,1):PRINT"TELEFONO:";M$(I,2)
430 IF IMOD10=0 THEN GOSUB 450
440 NEXT: GOSUB 450: RETURN
450 PRINT:PRINT "Premere spazio per continuare"
460 IF INKEY$=" " THEN CLS: RETURN ELSE 460
500 CLS:END
Linea 10: Aumentato la memoria stringhe con CLEAR, creato una matrice bidimensionale per 50 inserimenti e la variabile CN che ci servirà da contatore.
Linea 200: Faccio fare un controllo, nel sottoprogramma Inserimenti, per vedere se c’è ancora spazio nella memoria stringhe con la funzione FRE oppure se ha raggiunto i 50 inserimenti.
Nel resto del programma sostituite tutte le variabili normali con le matrici. Per le ricerche, visto che non ancora parlato delle funzioni che lavorano con le stringhe, ho lasciato quasi tutto com’era. Ma verrà ripreso a tempo debito.
Un’altra grossa pecca di questo programma è che quando lo chiuderemo, tutti i dati saranno persi. Ma anche a questo c’è un rimedio che spiegherò quando toccherò l’argomento dei FILES.
Se qualcosa non vi è chiara, scrivete, fate tutte le domande che volete. Inserite il mio nome nei commenti, visto che l’articolo viene pubblicato dall’associazione e purtroppo non riesco a vedere tutto.
Grazie e alla prossima.

0 commenti

Invia un commento

Il tuo indirizzo email non sarà pubblicato. I campi obbligatori sono contrassegnati *

LEZIONE 26 – INTERVAL ON, RND ED ALTRI

LEZIONE 26 – INTERVAL ON, RND ED ALTRI

Buongiorno a tutti, In questa puntata parlerò di un interrupt importante, specialmente per i giochi, quando vogliamo far apparire un nemico all'improvviso o un oggetto utile, ma anche per creare un cronometro o un orologio e tante altre cose. Il COMANDO sfrutta il...

it_ITIT_IT