...ma probabilmente tu volevi prima dichiarare quella variabile come Globale e nel corpo della routine creare l'Oggetto array.
In tal caso si procede come segue:
Public amb as String[ ]
Public Sub .........
' Crea l'Oggetto array di tipo Stringa monodimensionale senza definizione del numero dei suoi elementi:
amb = New String[ ]
https://www.gambas-it.org/wiki/index.php?title=Array:_creazione,_modifica_e_riempimento#Creazione_di_un_array_monodimensionale_senza_definizione_del_numero_dei_suoi_elementi
Ho comunque dato un'occhiata al Modulo, da te indicato, e confermo quanto scritto nel mio secondo messaggio.
Dopo la dichiarazione di "amb", quale variabile Globale dell'array di tipo Stringa, nelle singole sub-routine del Modulo, ove hai previsto la creazione dell'Oggetto afferente a quel array, l'uso della parol-chiave New va usata come segue:
Public amb As String[]
Public Function Carica_Ambi_Base() As String
Dim hFile As File
Dim sFile As String
Dim i As Integer
amb = New String[]
sFile = Application.Path &/ "Dati/base/amb/amb_bas"
....etc....
Mi intrometto in questa pausa per...
Visto che come tanti di noi vieni dal VB credo possano esserti utili alcuni consigli preliminari.
Evita di usare il carattere sottolineatura (_) nei nomi delle routine a meno che tu non abbia bisogno in una classe o modulo di nascondere una routine tipo:
Public Sub _Nascosta()
...
End
Usa la notazione camel tipo Public Sub FaccioQuesto()
oppure Public Function RestituiscoNumero() as Integer
Circa le variabili globali se sono private in Gambas è usanza porre un carattere dollaro davanti al nome es.
Public hTextBox as TextBox
Private $hTextBox as TextBox
Il codice della IDE di Gambas è scritto in Gambas puoi imparare molte cose studiando il codice scritto dal suo ideatore.
Una cosa importante Windows, quel determinato windows è unico, Linux è una babele di distribuzioni che usano librerie dinamiche diverse, librerie grafiche diverse, insomma la vita dei programmatori Linux è avventurosa occorre scontrarsi con anomalie che in windows non esistono, qui vige un po di anarchia.
Per ovviare ai molti problemi grafici Gambas ci mette a disposizione i contenitori, se li studi e impari ad usarli ti ritroverai già a buon punto.
Buon lavoro
... cercate di spiegarvi un po più terra terra per favore...
Giacché questa intera discussione verrà in futuro letta anche da neofiti della programmazione Orientata agli Oggetti, ne approfitto per spiegare la questione.
Nel suddetto tipo di Programmazione il pilastro fondamentale è il concetto di "Classe".
La "Classe" è un Modello astratto che racchiude e riassume tutte le caratteristiche funzionali (risorse) di un sistema di risorse per compiere ed ottenere un risultato.
La "Classe" è il sistema principale che possiede le risorse per svolgere la sua specifica funzione, per la quale è stata prevista.
« La "Classe" è un sistema organico di risorse tra loro coerenti per la realizzazione di una o più finalità. »
E' nella "Classe" che noi troviamo, come in un insieme, in una Categoria, specifiche capacità e specifiche competenze per poter perseguire e realizzare un risultato.
Le risorse di una "Classe" sono rappresentate da "Proprietà" (una risorsa che definisce una caratteristica assumibile), da "Metodi" (una capacità di fare qualcosa) e da "Eventi" (far accadere qualcosa).
La mera dichiarazione di una determinata "Classe" nel nostro codice non è sufficiente per richiamare e utilizzare nel codice tali risorse, poiché la "Classe" - se non è Statica - è "in potenza" le sue risorse possedute, ossia ha una capacità solo "potenziale" di esprimerle e di fornirle. Essa le possiede "virtualmente" La "virtù" di una cosa è la sua mera "attitudine" a essere o compiere qualcosa. E' insomma una capacità astratta. La "Classe" ci dice: "Io ho la capacità di fornire queste risorse, ma essendo una realtà astratta, le posseggo solo potenzialmente, non sono capace di fornirle in pratica.".
Affinché, dunque, il programmatore possa richiamare e utilizzare le tre risorse (o almeno quelle possedute) di una "Classe", questa deve essere "istanziata", deve essere "creata", posta nella realtà del codice che il programmatore sta scrivendo.
La "creazione" - senza voler tirare in ballo concetti filosofici o, peggio, teologici - consiste, appunto, nella concretizzazione di un'idea. L'idea, ossia la realtà con le sue risorse, si fa concreta, si "individualizza", diventa una "cosa", "causa" della creazione. La "Classe" diventa un "Oggetto".
La non staticità di una "Classe" consente al programmatore di creare più Oggetti di essa (questa facoltà non è consentita ad esempio per le Classi statiche e per i Moduli che sono "statici" per propria natura).
Come soltanto una realtà concreta può agire nel mondo, così nella programmazione soltanto un elemento concreto - l'Oggetto - può fornire e far agire le sue risorse, può dunque funzionare.
La creazione, la "istanziazione" della "Classe", affinché essa - come già detto - possa felicemente fornire le sue tre risorse, avviene solitamente nella codificazione in Gambas con la parola-chiave "NEW".
Questa riga astratta, significa che la variabile identificatrice rappresenta un Oggetto creato che appartiene ad una specifica Classe.
Ma la creazione di Oggetto di una "Classe" ha bisogno di sostanza anch'essa concreta, affinché possa effettivamente attuarsi. Questa sostanza è la memoria.
Gli "Oggetti" in Gambas sono costituiti da Strutture e Sub-Strutture, scritte in C, che ovviamente occupano memoria. Gambas con la parola-chiave "NEW" riserverà una certa quatità di memoria dedicata e destinata a far esistere e a far funzionare l'Oggetto, ossia a fornire e gestire le risorse che esso possiede in quanto "istanza" di una determinata "Classe".
Gambas, ovviamente, fornisce un elemento fondamentale, un escamotage, affinché il programmatore possa gestire nel codice agevolmente quell'Oggetto istanziato: un identificatore rappresentante, ossia la variabile (https://www.gambas-it.org/wiki/index.php?title=Le_Variabili) identificatrice dell'Oggetto:
variabile_identificatrice_dell'Oggetto = NEW CLASSE
Questa variabile è un "handle", una maniglia, uno strumento che ci consente di aprire la porta per accedere alla "stanza dei bottoni" della Classe, ossia alle risorse della Classe. Ma questa "stanza dei bottoni" non è in definitiva altro che l'Oggetto medesimo, ossia - detto più correttamente - quella quantità di memoria che il sistema riserva affinché l'Oggetto esista e possa essere utilizzato dal programmatore Gambas nel codice.
...quando ad esempio assegniamo un valore ad una Proprietà posseduta da una Classe (più concretamente: da un Oggetto istanziato di una Classe), dove credete che sia memorizzato quel valore ? ...all'interno di un membro di una sotto-Struttura che è parte della più ampia e complessiva memoria riservata per l'Oggetto, quando questo fu creato con la parola-chiave NEW.
Tutto è Memoria.
Questo handle, questa variabile che rappresenta l'Oggetto di una Classe, dunque individua, indica e in certo senso fornisce al programmatore la prima cella di memoria della Struttura principale che costituisce l'Oggetto medesimo.
La variabile di un Oggetto "punta" all'area di memoria riservata all'Oggetto medesimo.
Questa prima cella di memoria, ove inizia la memoria rigidamente riservata dal sistema per l'esistenza e la funzionalità dell'Oggetto di una Classe, possiede un Indirizzo.
La variabile di un Oggetto punta dunque a quell'Indirizzo di memoria, si riferisce esplicitamente a quella cella di memoria; anzi esso contiene come valore proprio l'indirizzo di memoria di quella cella.
Public Sub Main()
Dim bb As New Byte[]
Print bb, Object.Address(bb)
End
Possedendo l'indirizzo di quella prima cella dell'area di memoria dell'Oggetto, lo si ha un pugno: può essere gestito dal programmatore. Soltanto così il programmatore può usare le risorse fornite dalla "Classe" per mezzo del suo "Oggetto" creato.
La variabile di un Oggetto facilita il programmatore in questo compito: usandola, egli penetra inconsapevolmente nell'anima dell'Oggetto di una Classe, nella sua area di memoria.
https://www.gambas-it.org/wiki/index.php?title=Gli_Oggetti_e_le_Classi
Quindi, passando la variabile dell'Oggetto, noi passiamo l'indirizzo di memoria dell'Oggetto.
https://www.gambas-it.org/wiki/index.php?title=Passaggio_di_un_argomento_per_%27indirizzo%27_ad_una_Funzione
https://www.gambas-it.org/wiki/index.php?title=Scrivere_una_Funzione#Passaggio_per_indirizzo
Faccio un semplicissimo esempio di passaggio per indirizzo:
Public Sub Main()
Dim bb As New Byte[] ' Crea un Oggetto della Classe array di tipo Byte[ ]
Sottoprocedura(bb) ' Passa la variabile identificatrice dell'Oggetto array appena sopra creato
Print bb[0]
End
Private Function Sottoprocedura(bt as byte[]) ' Riceve l'Oggetto array
bt.Push(44)
End
Non c'è bisogno di alcun "Return" nella sub-routine "Sottoprocedura", poiché "bb" e "bt" puntano al medesimo Indirizzo di memoria, alla medesima cella di memoria, ove inizia la Struttura principale che costituisce l'Oggetto di tipo array.