In Gambas i Vettori sono degli
Oggetti, ossia entità individuali concrete di un insieme più ampio, di un Universale che li trascende, chiamato
Classe, e che rappresenta per essi un Modello, una Categoria
assoluta delle loro caratteristiche (Proprietà, Metodi, Eventi) possedute che li distinguono dagli
Oggetti appartenenti ad altre
Classi.
Pertanto gli
Oggetti, singolarità di una
Classe, per esistere devono, come ogni entità concreta immanente, essere
creati. In particolare, la creazione dei Vettori, se questi non sono istanziati in modo
esplicito e
diretto (modo "statico" dell'istanziazione di un vettore), richiede
imprescindibilmente l'uso della parola-chiave "
New".
Giunti a questa fase, va deciso se la variabile vettoriale (l'
Oggetto Vettore) deve prevedere una ri-allocazione - in esecuzione - dell'area di memoria da esso occupata per la memorizzazione dei suoi dati, ossia se debba avere un numero indeterminato o determinato di elementi indicizzati.
Da ciò deriva che se si opta per una dichiarazione indeterminata del numero degli elementi dell'array, la dichiarazione andrà fatta come segue:
L'
Oggetto array, seppur creato e individuato con una specifica variabile vettoriale, non possiede in quel momento alcun elemento indicizzato, al quale possa essere assegnato un valore. Va da sé che bisognerà attribuire all'array un nuovo elemento ogni volta che si voglia in esso immagazzinare un dato aggiuntivo.
Questa operazione va effettuata con il Metodo
.Push( ) dell'
Oggetto Vettore.
Ma detta soluzione non è utile alle necessità del codice in questione, poiché il vettore è suscettibile di vedersi assegnato un valore più volte nel medesimo elemento a causa dei previsti possibili richiami del GOTO alla correlata etichetta "
ricalcola: ".
Dunque, tralasciando, per ora, la parte destra di quella riga, va detto che è possibile così assegnare "staticamente" già in dichiarazione della variabile "v" il numero dei suoi elementi, come segue:
Ciò consente al programmatore, volendo, di impostare l'estremo maggiore del ciclo "For" con la Proprietà "
.Max della variabile array:
Inoltre, la soluzione "statica" dell'indicizzazione degli elementi vettoriali, consente in codice di conservare l'impostazione originaria almeno della parte sinistra dell'assegnazione della predetta riga di comando, appunto come segue:
Riguardo alla parte destra dell'assegnazione della riga di comando "v[ i ] = Int[Rnd * 90] + 1", vanno rilevati almeno due errori.
1) il primo - meno importante - si collega direttamente alla dichiarazione formale dell'indirizzo simbolico di memoria identificato con "Int". Infatti, tale identificatore di variabile "Int" è perfettamente uguale al nome della funzione nativa di Gambas "
Int( )". Questa scelta,
seppur indubitabilmente funzionante, non si rivela valida sotto il profilo della "
opportunità".
2) il secondo rileva una asimmetria fra dichiarazione della varibile di tipo Intero "Int" e suo uso concreto in routine. Infatti, la variabile "Int" viene dichiarata come variabile ad allocazione automatica della memoria di tipo Intero, ma viene poi formalmente utilizzata sintatticamente e morfologicamente come una variabile
array di tipo Intero.
Riguardo alla variabile di tipo Intero denominata "min", varrebbe il medesimo discorso di cui al punto 1) visto appena sopra per la variabile "Int".
In ordine, poi, agli "
If i = ...." mi associo al suggerimento di
Top Fuel di usare più elegantemente la risorsa di controllo decisionale "
Select Case....End Select".
La riga "
If i = 0 Then Goto vai" mi sembra essere superflua, non risultando influente l'eventuale valore della variabile "i" uguale a zero nel prosieguo delle righe presenti all'interno del ciclo "For". In tal caso verrebbe meno anche la connessa etichetta "
vai: " .
...ci sarà un modo di sostituire quei GOTO con altro ?