Autore Topic: non capisco questo messaggio di errore  (Letto 1540 volte)

Offline Nando_56

  • Gamberetto
  • *
  • Post: 13
    • Mostra profilo
    • Nando Gentile
non capisco questo messaggio di errore
« il: 10 Ottobre 2020, 17:04:54 »
Ho ricevuto questo errore cercando di compilare il programma:
   14 Variabile globale nascosta dalla dichiarazione locale amb
Dove vanno dichiarate le variabili tipo questa:
   Public amb as String[]
questo nella sezione dichiarazioni
   Dim amb as New String[]
e questro nella function Calcola_Ambi
E' sicuramente sbagliato, no ?
Bisogna dimenzionarle oppure no ?
Gentilmente qualcuno può aiuytarmi ?

Sarà una domanda stupida per voi, ma sono un gamberetto che viene dal vb 6 e faccio un pò fatica ad abituarmi qui su Mx Linux a questo bel linguaggio.

Grazie...

Amo il computer a tal punto da averne fatto il mio mestiere

Offline vuott

  • Moderatore globale
  • Senatore Gambero
  • *****
  • Post: 11.720
  • Ne mors quidem nos iunget
    • Mostra profilo
Re:non capisco questo messaggio di errore
« Risposta #1 il: 10 Ottobre 2020, 17:11:25 »
In buona sostanza hai dichiarato una variabile Globale con un nome identificatore uguale a quello di una variabile Locale.
Prima tu dichiari la variabile "amb" come Globale, poi nella sotto-procedura la dichiari come Locale: confliggendo così sotto il profilo dello "scope", della vita della variabile medesima.
Pertanto, possiamo dire che Gambas ti pone la domanda: "La variabile amb è Globale o Locale ?   :rolleyes: " .

   https://www.gambas-it.org/wiki/index.php?title=Le_Variabili
« Ultima modifica: 10 Ottobre 2020, 17:27:00 da vuott »
« Chiunque, non ricorrendo lo stato di necessità, nel proprio progetto Gambas fa uso delle istruzioni Shell o Exec, è punito con la sanzione pecuniaria da euro 20,00 a euro 60,00. »

Offline vuott

  • Moderatore globale
  • Senatore Gambero
  • *****
  • Post: 11.720
  • Ne mors quidem nos iunget
    • Mostra profilo
Re:non capisco questo messaggio di errore
« Risposta #2 il: 10 Ottobre 2020, 17:37:47 »
...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:
Codice: [Seleziona]
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
« Ultima modifica: 10 Ottobre 2020, 17:40:34 da vuott »
« Chiunque, non ricorrendo lo stato di necessità, nel proprio progetto Gambas fa uso delle istruzioni Shell o Exec, è punito con la sanzione pecuniaria da euro 20,00 a euro 60,00. »

Offline Nando_56

  • Gamberetto
  • *
  • Post: 13
    • Mostra profilo
    • Nando Gentile
Re:non capisco questo messaggio di errore
« Risposta #3 il: 10 Ottobre 2020, 17:42:00 »
Innanzitutto grazie per la risposta celere.
La variabile l'ho già dichiarata nel modulo CA (come Combinazioni Ambi), ma nel form per il calcolo non riesco a inserirla, ma forse è meglio che ti invii il progetto (non me lo dire, so già che è una ciofeca) perchè comincio anche io ad aver le idee confuse.
Amo il computer a tal punto da averne fatto il mio mestiere

Offline vuott

  • Moderatore globale
  • Senatore Gambero
  • *****
  • Post: 11.720
  • Ne mors quidem nos iunget
    • Mostra profilo
Re:non capisco questo messaggio di errore
« Risposta #4 il: 10 Ottobre 2020, 17:53:04 »
Devi creare i sorgenti come segue dal Menu in alto dell'IDE:

  Progetto-->Crea--->Pacchetto sorgenti

Poiché hai allegato un progetto è vastissimo, spiegami preliminarmente e chiaramente DOVE devo guardare.
« Chiunque, non ricorrendo lo stato di necessità, nel proprio progetto Gambas fa uso delle istruzioni Shell o Exec, è punito con la sanzione pecuniaria da euro 20,00 a euro 60,00. »

Offline Nando_56

  • Gamberetto
  • *
  • Post: 13
    • Mostra profilo
    • Nando Gentile
Re:non capisco questo messaggio di errore
« Risposta #5 il: 10 Ottobre 2020, 17:58:03 »
Grazie ho capito il meccanismo (credo) Funziona, sei stato chiarissimo, cmq se vuoi dare lo stesso un'occhiata all'archivio naturalmente con il tuo comodo, sicuramente mi puoi dare qualche altra dritta ancora, se non ti è di troppo disturbo naturalmente.
Le parti funzionanti sono Frm_02_EstLot, Frm_03_EstSel, Frm_04_Nume il Frm_01_Inf, non far caso a quello dei terni perchè ci ho copiatp il form dei numeri come anche in quello degli ambi...
Ringraziando anticipatamente ti invio i miei più cordiali saluti...
Amo il computer a tal punto da averne fatto il mio mestiere

Offline Nando_56

  • Gamberetto
  • *
  • Post: 13
    • Mostra profilo
    • Nando Gentile
Re:non capisco questo messaggio di errore
« Risposta #6 il: 10 Ottobre 2020, 18:11:26 »
Scusa ma se facevo
Progetto-->Crea--->Pacchetto sorgenti
viene fuori un archivioi di 11.2 Mb che non posso allegare o c'è qualche escamotage ?
Amo il computer a tal punto da averne fatto il mio mestiere

Offline vuott

  • Moderatore globale
  • Senatore Gambero
  • *****
  • Post: 11.720
  • Ne mors quidem nos iunget
    • Mostra profilo
Re:non capisco questo messaggio di errore
« Risposta #7 il: 10 Ottobre 2020, 18:11:57 »
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:

Codice: [Seleziona]
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....
« Chiunque, non ricorrendo lo stato di necessità, nel proprio progetto Gambas fa uso delle istruzioni Shell o Exec, è punito con la sanzione pecuniaria da euro 20,00 a euro 60,00. »

Offline Nando_56

  • Gamberetto
  • *
  • Post: 13
    • Mostra profilo
    • Nando Gentile
Re:non capisco questo messaggio di errore
« Risposta #8 il: 10 Ottobre 2020, 18:18:30 »
Dopo innumerevoli prove devo aver cancellata dalla dichiarazioni del modulo la linea con
Public amb As String[]
ora la riaggiungo subito...
Amo il computer a tal punto da averne fatto il mio mestiere

Offline vuott

  • Moderatore globale
  • Senatore Gambero
  • *****
  • Post: 11.720
  • Ne mors quidem nos iunget
    • Mostra profilo
Re:non capisco questo messaggio di errore
« Risposta #9 il: 10 Ottobre 2020, 18:19:36 »
...mi puoi dare qualche altra dritta ancora...

1a domanda:  poiché tu crei un Oggetto array in ogni sotto-procedura del Modulo "CA.module", perché utilizzi una variabile Globale ?

2a domanda: perché la variabile "amb", che identifica l'Oggetto array, l'hai dichiarata "Pubblica" ? Non potresti crearla altrove e passarla "per indirizzo" al Modulo "CA.module" ? Sempre "per indirizzo" il Modulo la ripasserebbe alla Classe/Modulo che ha chiamato la routine di  "CA.module".
« Ultima modifica: 10 Ottobre 2020, 18:21:37 da vuott »
« Chiunque, non ricorrendo lo stato di necessità, nel proprio progetto Gambas fa uso delle istruzioni Shell o Exec, è punito con la sanzione pecuniaria da euro 20,00 a euro 60,00. »

Offline Gianluigi

  • Moderatore globale
  • Senatore Gambero
  • *****
  • Post: 4.244
  • Tonno verde
    • Mostra profilo
Re:non capisco questo messaggio di errore
« Risposta #10 il: 10 Ottobre 2020, 18:45:54 »
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:
Codice: [Seleziona]
Public Sub _Nascosta()
  ...
End

Usa la notazione camel tipo
Codice: [Seleziona]
Public Sub FaccioQuesto()
oppure
Codice: [Seleziona]
Public Function RestituiscoNumero() as Integer

Circa le variabili globali se sono private in Gambas è usanza porre un carattere dollaro davanti al nome es.
Codice: [Seleziona]
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
« Ultima modifica: 10 Ottobre 2020, 18:48:20 da Gianluigi »
nuoto in attesa del bacio di una principessa che mi trasformi in un gambero azzurro

Offline Nando_56

  • Gamberetto
  • *
  • Post: 13
    • Mostra profilo
    • Nando Gentile
Re:non capisco questo messaggio di errore
« Risposta #11 il: 10 Ottobre 2020, 18:56:05 »
Scusami ma da come ti esponi sembra che i concetti di passare come riferimento o per indirizzo ti siano molto familiari, quindi presumo che hai molta familiarità con il linguaggio c o c++, cosa che io purtroppo non ho imparato per pigrizia e perchè non avevo nessuno con cui parlarne così che mi facesse capire i concetti base almeno, io a differenza di te ho imparato quasi subito il l'Msx Basic per passare subito all'assembler dello Z80, e data la grande pubblicità per commodore, quando stavo per prendere familiarità con il basic di quest'ultimo (con tutti i suoi Peek e Poke) mi hanno regalato un Amiga 1200 (I più bei tempi sono stati senz'altro quelli) dove ho imparato quasi subito Amos Professional (Meraviglioso!!!) e anche i suoi sottolinguaggi come interface, per non parlare di Arexx (il Rexx adattato all'Amiga) dove ho usato le varie Gui e ci ho fatto un bel pò di programmi dopo essere passato per l'assembler Amiga 68000/20/30/40/60  per poi andare a finire con quello schifo del Vb6 che mi ha fatto penare non poco, ma oggi programmare sta diventando sempre più difficile e per questo sono passato a Mx Linux (Addio Winzozz) a da quanto ho capito Gambas somiglia un poco ad Amos (nella sua complessità) solo che allora c'erano un bel pò di manuali ben scritti in italiano e adesso non c'è quasi più niente del genere, il mondo è pieno di Inglese e basta.
Scusate tutti per il mio sfogo, ma dopo una vita di programmazione non intendo arrendermi...
Prometto che ce la metterò tutta per capire al meglio le vostre dfritte ma cercate di spiegarvi un po più terra terra per favore...
   Nando_56...
Amo il computer a tal punto da averne fatto il mio mestiere

Offline Nando_56

  • Gamberetto
  • *
  • Post: 13
    • Mostra profilo
    • Nando Gentile
Re:non capisco questo messaggio di errore
« Risposta #12 il: 10 Ottobre 2020, 19:14:28 »
Grazie anche a te Gianluigi farò senz'altro tesoro anche delle tue dritte, e scusatemi ancora per lo sfogo, ma rinnovo la mia promessa di imparare più che posso, si è vero, ho notato anch'io che il mondo di Linux è molto variegato e un pò incasinato diciamocelo, ma è il prezzo che dobbiamo pagare per la nostra Libertà che solo qui possiamo trovare, purtroppo non sempre ho tutto il tempo che voglio per programmare, infatti il lavoro fatto finora per LottoTecno è stato un pò spezzettato, ma farò di questo programma con la potenza di Gambas e naturalmente con le vostre dritte di tanto in tanto, un lavoro che farà rabbrividire la versione in vb6...
Amo il computer a tal punto da averne fatto il mio mestiere

Offline vuott

  • Moderatore globale
  • Senatore Gambero
  • *****
  • Post: 11.720
  • Ne mors quidem nos iunget
    • Mostra profilo
Re:non capisco questo messaggio di errore
« Risposta #13 il: 10 Ottobre 2020, 19:49:11 »
io a differenza di te ho imparato quasi subito il l'Msx Basic per passare subito all'assembler dello Z80, e ......
A quei tempi io cominciai con il Quick Basic e un po' di Assembly.


Scusate tutti per il mio sfogo, ma dopo una vita di programmazione non intendo arrendermi...
Prometto che ce la metterò tutta per capire al meglio le vostre dritte
Questo ti fa onore.
Qui tu... noi siamo in un forum che intende appunto aiutare coloro che hanno problemi/difficoltà con i protocolli e la sintassi del linguaggio Gambas.
Pertanto, tu puoi liberamente chiedere ogni delucidazione riguardo al linguaggio Gambas.
...si richiede soltanto "brevità", "chiarezza" e "semplicità" nella domanda posta e nei codici eventualmente riportati o allegati.
« Chiunque, non ricorrendo lo stato di necessità, nel proprio progetto Gambas fa uso delle istruzioni Shell o Exec, è punito con la sanzione pecuniaria da euro 20,00 a euro 60,00. »

Offline vuott

  • Moderatore globale
  • Senatore Gambero
  • *****
  • Post: 11.720
  • Ne mors quidem nos iunget
    • Mostra profilo
Re:non capisco questo messaggio di errore
« Risposta #14 il: 10 Ottobre 2020, 20:43:47 »
... 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".
Codice: [Seleziona]
 oggetto = NEW CLASSE
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 identificatrice dell'Oggetto:
Codice: [Seleziona]
 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.
 
Codice: [Seleziona]
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:
Codice: [Seleziona]
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.
« Ultima modifica: 12 Ottobre 2020, 10:43:11 da vuott »
« Chiunque, non ricorrendo lo stato di necessità, nel proprio progetto Gambas fa uso delle istruzioni Shell o Exec, è punito con la sanzione pecuniaria da euro 20,00 a euro 60,00. »