Gambas-it

Gambas3 => Programmazione => Topic aperto da: vir1966 - 07 Giugno 2019, 13:13:27

Titolo: Tenere in memoria piu valori della stessa variabile
Inserito da: vir1966 - 07 Giugno 2019, 13:13:27
Continuando a convertire il programmino auto scritto per calcolare serramenti, scritto con Vb5/6 ad un certo punto mi trovo davanti ad un muro......con vb mantenevo in memoria tramite "ReDim Preserve" la stessa variabile (es. larghezzaanta) assegnandole un numero in sequenza ad ogni misurazione e per piu misurazioni..... per poi alla fine richiamarle per visualizzarle e o stamparle utilizzando un ciclo "for to next".....ed ecco che quà si presenta il muro, Gambas ReDim Preserve non lo riconosce, quindi quale altra procedura dovrei utilizzare per ottenere la stessa cosa?
Grazie
Titolo: Re:Tenere in memoria piu valori della stessa variabile
Inserito da: Gianluigi - 07 Giugno 2019, 14:26:37
Tu stai parlando di un vettore.
Come più volte detto Gambas non è VB, quindi non possiamo pretendere che funzioni allo stesso modo.
Studiati i vettori che in Gambas sono degli oggetti e vanno istanziati prima di poter essere usati.

esempio:

Codice: [Seleziona]
  Dim larghezzaanta as New Integer[]
  larghezzaanta.Push(560)
  Print larghezzaanta[0]

Vedi: https://www.gambas-it.org/wiki/index.php?title=Guide_della_comunit%C3%A0#Array_.28Vettori.29_e_Matrici
Titolo: Re:Tenere in memoria piu valori della stessa variabile
Inserito da: vir1966 - 07 Giugno 2019, 20:13:48
Tu stai parlando di un vettore.
Come più volte detto Gambas non è VB, quindi non possiamo pretendere che funzioni allo stesso modo.
Studiati i vettori che in Gambas sono degli oggetti e vanno istanziati prima di poter essere usati.

esempio:

Codice: [Seleziona]
  Dim larghezzaanta as New Integer[]
  larghezzaanta.Push(560)
  Print larghezzaanta[0]

Vedi: https://www.gambas-it.org/wiki/index.php?title=Guide_della_comunit%C3%A0#Array_.28Vettori.29_e_Matrici
Ciao Gianluigi...grazie per la risposta, sicuramente Gambas non è Vb e viceversa, mi leggerò la guida e vediamo cosa ne viene fuori  :hatecomputer:
Titolo: Re:Tenere in memoria piu valori della stessa variabile
Inserito da: Gianluigi - 07 Giugno 2019, 22:40:36
Ciao,
io non voglio entrare nelle tue scelte e non conoscendo cosa deve fare il tuo programma non potrei anche volendo.
Ad esempio se la tua necessità fosse quella di dover abbinare una misura a una data voce, ad esempio altezzaantadestra, larghezzaantadestra, spessoremontantedestro ecc. forse una Collection sarebbe più adatta allo scopo, dai un'occhiata:
http://gambaswiki.org/wiki/comp/gb/collection?l=it
https://www.gambas-it.org/wiki/index.php?title=Guide_della_comunit%C3%A0#Collection

Se esponi chiaramente il problema e dici come vorresti risolverlo, magari qualcuno tira fuori un'idea che può piacerti... o magari no... 
Titolo: Re:Tenere in memoria piu valori della stessa variabile
Inserito da: vir1966 - 08 Giugno 2019, 11:22:37
Al momento ho creato una variabile pubblica vettore
Codice: [Seleziona]
Public largoanta as New variant[25]
e lo impostata a 25 perche devo ancora capire come renderla dinamica.
Poi nella Public sub_ memorizza()  ho inserito la riga
Codice: [Seleziona]
largoanta[contatore] = larghezzaanta
Facendo poi piu misurazioni e dando un
Codice: [Seleziona]
for i = 1 to contatore
Print largoanta[i]
next
riesco a vedere correttamente le varie misurazioni incamerate dal vettore
Titolo: Re:Tenere in memoria piu valori della stessa variabile
Inserito da: Gianluigi - 08 Giugno 2019, 11:59:46
Intanto partiamo da Public, se largoanta deve essere visibile solo nel modulo/classe in cui è dichiarato allora basterebbe un Private, altrimenti è OK.

Variant: come ti è già stato suggerito da vuott non serve usare variant a meno che tu non debba inserire numeri e stringhe insieme.

Non è che il valore di larghezzaanta è una scritta più un numero?

Perchè non spieghi esattamente quale è il tuo problema e come hai pensato di risolverlo?

Sarebbe molto più semplice capirsi.

Comunque per una dinamicità degli array non impostati puoi aggiungere il dato con .Push(larghezzaanta) oppure con .Add(larghezzaanta).
Invero puoi rendere dinamico anche un array preimpostato con .Resize(26) che assomiglia a redim di vb.

Dimenticavo: quasi tutto in programmazione si conta da zero pertanto un array di 10 valori parte da array[0] e finisce con array[9].
Titolo: Re:Tenere in memoria piu valori della stessa variabile
Inserito da: vir1966 - 08 Giugno 2019, 14:48:50
"largoanta" è Public per essere vista sia nella sub memorizza che poi nella sub stampa o visualizza.
Variant perché alcuni dati li raccolgo da textbox e per evitare conflitti preferisco variant.
In realtà non c'è un problema.....dovevo solo capire come riscrivere il codice originario in funzione di Gambas che non prevede i ReDim Preserve....approposito ringrazio per le dritte .Push .Add e .Resize, me le studierò per sistemare la questione della dinamicità.
Per il discorso che gli Array partono da zero, non è possibile impostare Option Base 1 ?
Titolo: Re:Tenere in memoria piu valori della stessa variabile
Inserito da: Gianluigi - 08 Giugno 2019, 15:41:15
Per il discorso che gli Array partono da zero, non è possibile impostare Option Base 1 ?
In Gambas non esiste Option Base 1.

Citazione
"largoanta" è Public per essere vista sia nella sub memorizza che poi nella sub stampa o visualizza.
Che largoanta deve essere vista da altre sub è chiaro, ma se le sub sono nella stessa classe (o modulo) non serve Public basta Private.
Citazione
Variant perché alcuni dati li raccolgo da textbox e per evitare conflitti preferisco variant.

È sempre un rischio trattare il tipo variant perchè può introdurre dei bug difficili da scovare, del tipo:
"Ottengo un risultato apparentemente corretto ma in realtà sbagliato".
Ti conviene sempre trattare con dati specifici ad esempio usando misure in millimetri conviene adottare Integer come tipo di dato.
Quando si ricevono dati numerici da delle textbox si opera una conversione del tipo, così:
Codice: [Seleziona]
mioInteger = Cint(TextBox1.Text).

Così saremo sempre tranquilli dei nostri calcoli.

Io capisco che tu ti voglia limitare a convertire un programma (funzionante) in Gambas, ma se mentre lo fai lo puoi migliorare imparando qualcosa di nuovo, non è più corretto fare così?
Titolo: Re:Tenere in memoria piu valori della stessa variabile
Inserito da: Top Fuel - 08 Giugno 2019, 16:12:53
Se vuoi puoi fare anche a meno della variabile contatore, per scansionare un array senza sapere di quanti elementi è composto puoi fare così:

Codice: [Seleziona]
For i = 0 to largoanta.Max
   print largoanta[i]
Next

Max in un array restituisce l'indice dell'elemento più alto.
E pensare magari di scrivere una classe/i con tutte le caratteristiche che deve avere un serramento per poi creare degli oggetti su cui lavorare?
Renderebbe tutto più semplice.
Titolo: Re:Tenere in memoria piu valori della stessa variabile
Inserito da: vuott - 08 Giugno 2019, 17:36:36
"largoanta" è Public per essere vista sia nella sub memorizza che poi nella sub stampa o visualizza.
Come ti ha chiaramente già spiegato l'amico Gianluigi, l'opzione "Pubblic" non serve per rendere visibile il contenuto di una variabile all'interno delle subroutine appartenenti ad un medesimo Modulo o Classe, ...del resto, quando ti ho scritto questo post:
   http://www.gambas-it.org/smf/index.php?topic=7085.msg45973#msg45973
io non l'ho fatto per fare il saputello.


Variant perché alcuni dati li raccolgo da textbox e per evitare conflitti preferisco variant.
Non capisco perché Minisini non lo elimina, il tipo Variant, da Gambas !   :bad:
Titolo: Re:Tenere in memoria piu valori della stessa variabile
Inserito da: Gianluigi - 08 Giugno 2019, 17:58:10
Citazione
Non capisco perché Minisini non lo elimina, il tipo Variant, da Gambas !   :bad:

E le Collection e i programmi già creati?
Meglio di no, ma nessuno ci obbliga ad usarle, io in tanti anni (e pochi programmi) di VBA e Gambas non le ho mai usate, mai.  :bad:
Titolo: Re:Tenere in memoria piu valori della stessa variabile
Inserito da: Top Fuel - 08 Giugno 2019, 18:08:02
Nemmeno io. :bad:
Titolo: Re:Tenere in memoria piu valori della stessa variabile
Inserito da: vir1966 - 08 Giugno 2019, 18:59:48
Ringrazio tutti per le risposte e delucidazioni, sono oro colato.... naturalmente da ignorantone quale sono vado per gradi per non stravolgere troppo e trovarmi altre problematiche da risolvere visto che le varianti nell'ambito dei serramenti sono molteplici
Titolo: Re:Tenere in memoria piu valori della stessa variabile
Inserito da: dex - 11 Giugno 2019, 18:35:06
Ciao mi inserisco qui perchè si è parlato di collection

io ho la necessita di creare una nuova collezione pubblica da codice, in una funzione mi arrivano i dati dal database e dovrei creare una collection per ogni cliente da codice.
il problema è che poi le devo poter leggere in altri form.

Creando da codice è pubblica oppure va settata diversamente?
Titolo: Re:Tenere in memoria piu valori della stessa variabile
Inserito da: Gianluigi - 11 Giugno 2019, 19:50:11
Ciao dex,
se hai un database mi riesce difficile capire a cosa ti serva una collection.
Comunque ti allego un piccolo esempio che spero possa esserti di aiuto.

 :ciao:
Titolo: Re:Tenere in memoria piu valori della stessa variabile
Inserito da: dex - 11 Giugno 2019, 21:56:47
Ciao Gian
il database è in remoto e ogni volta per le query è lento.

grazie per l'esempio ora ci guardo
Titolo: Re:Tenere in memoria piu valori della stessa variabile
Inserito da: dex - 11 Giugno 2019, 22:14:32
Gian nel tuo esempio la carichi come una matrice.
collection ha la possibilità delle key, io volevo sfruttare proprio queste per leggere i dati.

provo a fare delle modifiche
Titolo: Re:Tenere in memoria piu valori della stessa variabile
Inserito da: Gianluigi - 11 Giugno 2019, 22:20:41
Io ho fatto un semplice esempio che sfrutta il fatto che il valore di una collection è variant (e quindi può essere anche una matrice stringa), solo per dimostrarti che se la collection è pubblica la puoi interrogare ovunque.
Tu la collection la puoi creare come desideri.
Titolo: Re:Tenere in memoria piu valori della stessa variabile
Inserito da: Gianluigi - 11 Giugno 2019, 22:25:22
Ciao Gian
il database è in remoto e ogni volta per le query è lento.


Hai mai preso in considerazione di affiancare al remoto un database locale leggero come SQLite?
So che tanti lo fanno...
Titolo: Re:Tenere in memoria piu valori della stessa variabile
Inserito da: dex - 11 Giugno 2019, 22:52:25
Ciao Gian
il database è in remoto e ogni volta per le query è lento.


Hai mai preso in considerazione di affiancare al remoto un database locale leggero come SQLite?
So che tanti lo fanno...

si potrei anche farmi una tabella mysql o un file testo, ma trovo meglio lavorare con le variabili, in quanto con il database per ogni query comunque devo memorizzare in una variabile.

una domanda i numeri 1 2 e 3 che aggiungi dopo ss sono una numerazione tipo indice? la collection ha un suo index?
Titolo: Re:Tenere in memoria piu valori della stessa variabile
Inserito da: Gianluigi - 11 Giugno 2019, 23:21:52
una domanda i numeri 1 2 e 3 che aggiungi dopo ss sono una numerazione tipo indice? la collection ha un suo index?

Una collection si carica così NomeCollection.Add(Valore come variant, Chiave come stringa)
Ma puoi anche caricarla linearmente tipo array: collezione = [chiave come stringa, valore come variant, chiave come string, valore...]

Molto interessante anche questa lezione di Orionis:
https://www.gambas-it.org/wiki/index.php?title=Confronto_Array_di_Strutture_verso_Collezione_di_Classi#COLLECTION
Titolo: Re:Tenere in memoria piu valori della stessa variabile
Inserito da: dex - 19 Giugno 2019, 01:23:20
Ciao raga
mi serve un mano che mi sono incartato

devo creare delle Collection da programma in esecuzione e non da codice, in qiuanto non so a priori ne il nome ne la quantita delle collection

da una query del database mi arriva un certo numero di record, per ogni record mi serve una collection, per esempio, query 30 record, mi servono 30 collection tipo:

record 1 codice cliente SF241
Codice: [Seleziona]
Dim SF241 As Collection = ["nome": "Antonio", "cognome": "Norcino", ecc...]

record 2 codice cliente SF278
Codice: [Seleziona]
Dim SF278 As Collection = ["nome": "Pinto", "cognome": "Pallino", ecc...]

e cosi via per 30 collection

mi serve sapere solo come crearle al volo, poi con un ciclo le faccio caricare i dati



Titolo: Re:Tenere in memoria piu valori della stessa variabile
Inserito da: Gianluigi - 19 Giugno 2019, 10:15:13
Ciao dex,
direi che più incartato di così sia impossibile.
Ma ti sembra percorribile la tua soluzione?
Ma neanche i principianti.  :violent:
È impossibile dichiarare variabili in modo dinamico, questo almeno in un dialetto basic, auguriamoci che vuott abbia la voglia di illuminarci un po al riguardo.
La soluzione la puoi trovare nell'articolo di Orionis che ti ho già indicato.
Crei dinamicamente una collezione di oggetti utenti.
Oppure carichi un array di array: vedi DynamicMatrixExample negli Esempi della Software farm.
Attento però all'insidia di poter esaurire la memoria caricandoci un'intera tabella, è per questa ragione che esistono i database e SQL.

P.S. Mi è venuto in mente che potrebbe essere utile anche questo esempio:
http://www.gambas-it.org/smf/index.php?topic=6369.msg43941#msg43941
Titolo: Re:Tenere in memoria piu valori della stessa variabile
Inserito da: dex - 19 Giugno 2019, 23:40:33
Ciao Gian
hai ragione la vedo dura, cmq sopra mi sono espresso male, intendevo assegnargli in modo dinamico il nome della variabile, tipo dichiarata Dim Cliente as new String e poi rinominarla in C452,  ma comunque come hai precisato tu la strada è difficile e rischio di esaurire subito le risorse.

Anche appoggiandomi a un database locale le cose non cambiano, devo fare tantissime query scaricare i risultati delle query nelle variabili e usare le variabili per i processi di analisi, grafici, comparazione ecc..

mi devo studiare un'altra strada, tipo aggregare prima con le query quanti più dati possibile e poi scaricare i dati nelle variabili usarli e distruggere subito le variabili

grazie dell'aiuto e alla prossima.

ps. se lo vedi salutami vuott