Autore Topic: array bidimensionale a righe incrementabili  (Letto 2176 volte)

Offline Picavbg

  • Senatore Gambero
  • ******
  • Post: 1.620
    • Mostra profilo
array bidimensionale a righe incrementabili
« il: 19 Agosto 2012, 13:30:15 »
Mi è venuto in mente questo argomento a causa delle possibilità restrittive di Gambas nei confronti degli array multidimensionali. Infatti, mentre per gli array unidimensionali si può dichiarrare:
Codice: [Seleziona]
Dim ArrayUnaDimensione as new string[]
per un array bidimensionale occorre necessariamente scrivere:
Codice: [Seleziona]
Dim ArrayDueDimensioni as new string[RR, C]
dove "RR" sono le righe della tabella e "C" sono le colonne di ciascuna riga.

Io ho la bnecessità di gestire un array bidimensionale di cui non posso sapere all'avvio quante righe ospiterà. Allora ho cercato di sfruttare il concetto di Array con dimensionamento successivo illustrato nel wiki del forum. Naturalmente ho dovuto adattarlo alle mie necessità, perchè è possibile che debba aggiungere nuove righe oppure debba solo modificare il contenuto di una o più colonne di una riga già esistente. Partendo da detto concetto di base ho pensato di dichiarare inizialmente, nella classe che si occupa della sua gestione, un array bidimensionale ad una sola riga, tanto per non incappare nella segnalazione di errore formale durante il controllo del runlevel di G3 e di seguire quindi due perorsi di aggiornamento dell'array, uno che prevede l'aggiunta di una nuova riga, l'altro che agisce sui valori già presenti in una riga già esistente, individuata come oggetto di modifica. La seconda via rientra nella gestione ordinaria di un array bidimensionale, quindi non meritevole di attenzione nella presente analisi. Lo studio ha richiesto un impegno mirato per l'aggiunta di una nuova riga. Naturalmente le righe devono essere tenute in ordine crescente di data, la quale occupa la prima colonna di ciascuna riga.

Visto che Gambas permette di aggiungere nuove righe solamente agli array unidimensionali, ho pensato di costruire un secondo array, questa volta ad una dimensione, che da ora in poi chiamerò $TabUniD, di validità temporanea  dove trasferire tutte righe della tabella bidimensionale che da ora in poi chiamerò $TabDueD, disponendo tutte le colonne in sequenza dentro una stringa unica, all'interno della quale ciascuna colonna è tenuta distinta dalla precedente e dalla successiva da un carattere separatore. Ottenutà così la nuova $TabUniD ho potuto aggiungervi la nuova riga creata con lo stesso metodo di prima. Mi restava l'onere di ricostituire la $TabDueD con l'incremento di una riga, dopo però avere ricostuito l'ordine crescente di cui ho detto all'inizio, ciò perchè non è possibile dare un comando di sort per un array multidimensionale. Ho affidato il compito di ridistribuzione delle righe di  $TabUniD  nelle righe e colonne di $TabDueD alla  funzione Split, ma ho dovuto tenere presente una nuova esigenza: costruire una stringa dove accodare tutte le righe della  $TabUniD. Nella funzione Split ho anche aggiunto il riconoscimento e l'abbandono sia di sequenze di caratteri escape che di elementi vuoti. Dopo tutto quanto detto la nuova $TabDueD ottenuta è piaciuta al resto del programma esistente ed il suo funzionamento è stato mantenuto perfettamente integro, ma soprattutto ho eliminato il rschio di vedere interrotta l'esecuzione del programma per "out of bounds".

Tutto quanto appena illustrato si riduce alle seguenti righe di codice:
Codice: gambas [Seleziona]
' Classe [b]TrattaTabDueD[/b]
 
Public iIndTabDueD As Integer
Static Public iTotElTabDueD As Integer

Static Public $TabDueD As New String[iTotElTabDueD + 1, 7]

Public Sub _new(i_CoVoConCas As Integer, i_DataContPri As Integer, fImport As Float, $_NmCreDeb As String, i_CoVoContrPart As Integer, $DataCont As String, $_SwPreMom As String, i_DtCoUltPreMom As Integer)
 If iTotElTabDueD = 0 Then
    iIndTabDueD -= 1
  Endif
'---------- bla ------ bla  ------ bla ----------
 If iIndTabDueD = (-1) Then
       iTotCar = AccodElemNuo(iTotCar, i_DataContPri, fImport, $_SwPreMom, $_NmCreDeb, i_CoVoContrPart, $_TipoPreMom, i_DtCoUltPreMom)
 Else
     bTrovato = TrovElemTabDueD(i_DataContPri, $_NmCreDeb, fImport, $_TipoPreMom)
      If Not bTrovato
        iTotCar = AccodElemNuo(iTotCar, i_DataContPri, fImport, $_SwPreMom, $_NmCreDeb, i_CoVoContrPart, $_TipoPreMom, i_DtCoUltPreMom)
      Endif
 Endif
'---------- bla ------ bla  ------ bla ----------
END

Public Function AccodElemNuo(iTotCar As Integer, i_DataContPri As Integer, fImport As Float, $_SwPreMom As String, $_NmCreDeb As String, i_CoVoContrPart As Integer, $_TipoPreMom As String, i_DtCoUltPreMom As Integer) As Integer
Dim i As Integer
Dim iConta As Integer
Dim ind1 As Integer
Dim ind2 As Integer

Dim $Credito As String
Dim $Debito As String
Dim $StriPreMom As String

Dim $TabUniD As New String[]
'---------------------------------------------------------------------------------------------------------------------------------------------- 
  If iTotElTabDueD > 0
    For i = 0 To iTotElTabDueD - 1
      $TabUniD.Add("§" & $TabDueD[i, 0] & "§" & $TabDueD[i, 1] & "§" & $TabDueD[i, 2] & "§" & $TabDueD[i, 3] & "§" & $TabDueD[i, 4] & "§" & $TabDueD[i, 5] & "§" & $TabDueD[i, 6])
    Next
  Endif
  If fImport >= 0 Then
      $Debito = CFloat(fImport)
      $Credito = 0
  Else
      $Debito = 0
      $Credito = CFloat(fImport)
  Endif
  $TabUniD.Add("§" & (Str(i_DataContPri)) & "§" & $Credito & "§" & $Debito & "§" & (UCase($_TipoPreMom)) & "§" & $_NmCreDeb & "§" & (Str(i_CoVoContrPart)) & "§" & (Str(i_DtCoUltPreMom)) & "§")
  Inc iTotElTabDueD
  $TabUniD.Sort
  For i = 0 To iTotElTabDueD - 1
    $StriPreMom &= $TabUniD[i]
  Next
    $TabUniD.Clear
  $TabUniD = Split($StriPreMom, "§", "\r\n", True)
  iConta = $TabUniD.Count - 1
  For i = 0 To iConta
      $TabUniD[i] = Replace($TabUniD[i], Chr(34), ")")
  Next
  $TabDueD = New String[iTotElTabDueD, 7]
  i = 0
  ind1 = 0
  For i = 0 To iTotElTabDueD - 1 
    For ind2 = 0 To 6
      $TabDueD[i, ind2] = $TabUniD[ind1]
      Inc ind1
    Next
  Next
End


Sicuramente si poteva fare diversamente, non so se più veloce ed intuitivo. Io non ho saputo fare di meglio. Quanto m'è costato? Due giorni circa di lavoro, con annesso mal di denti.
Eventuali suggerimenti, critiche e disapprovazioni sono sempre ben accolti.
Ciao a tutti.
:ciao:

Offline md9327

  • Moderatore
  • Senatore Gambero
  • *****
  • Post: 2.840
    • Mostra profilo
Re: array bidimensionale a righe incrementabili
« Risposta #1 il: 22 Agosto 2012, 01:22:35 »
Allora, non per smontare il tuo bel lavoro di studio, ma gli array multidimensionali si possono fare, anche se in modo diverso da come hai tentato di fare.

E' vero che gli array di base String[], Integer[], ecc. hanno la possibilità di essere creati come array multimensionali, ma si può fare anche in altro modo, ovvero usando i Variant.

Il Variant è un oggetto che può contenere valori di diverso tipo. La tipologia dei valori può essere diversa anche tra i valori nella stessa colonna, ma ad ogni modo il concetto che vado a descrivere è quello dell'uso con la multimensionalità.

Anche per il Variant esiste un oggetto array, appunto Variant[], che non è altro che un array di valori di vario tipo. Però, dato che il Variant stesso può contenere un array come valore unico, l'utilità è puramente estetica.

Ad ogni modo, mettiamo di voler memorizzare una serie di numeri (potrebbero essere stringhe, ma il concetto è lo stesso...).
A questo punto andiamo a creare una array Variant[] che, come da sintassi Gambas, può essere creato vuoto, quindi senza alcun elemento.
Mettiamo di voler creare un array bidimensionale (il concetto poi si può propagare all'infinito...), contenente appunto una serie di numeri.
Dato che l'array multidimensionale, per come è fatto, ha come indice solamente la posizione del valore interno all'array, ogni elemento và indirizzato con la proprietà Index (comune a tutti gli array). L'aggiunta di elementi può essere fatta con il metodo Add(), oppure con il metodo Insert() (quest'ultimo ha la possibilità di inserire elementi in un punto specifico, non appeso alla fine dell'array come di default).
In questo modo avremo un'array di numeri, molto simile ad un'array di Integer[] (ad esempio...).

Mettiamo di voler invece creare un'array con un ulteriore livello.
Per fare questo è sufficiente creare un'array Variant[] in ogni elemento dell'array padre: <Variant[]>.Add(<Variant[]>).
Questa logica può essere applicata all'infinito.

L'unico neo di questo metodo, è che se si và a modificare in runtime la struttura di un'array multidimensionale, potremmo avere elementi con numero di colonne non allineate, ovvero ad esempio, avere l'elemento 0 con un valore, e l'elemento 1 con 3/3 valori.
In questo caso, non sono stati previsti metodi per compensare un disallineamento di questo tipo, e si dovrà ricorrere per forza ad una funzione apposita, o derivare la classe array in un nuovo oggetto/classe che ha la funzione appropriata.

Per costruire questo tipo di funzione, si dovrà tener conto: 1) del numero di dimensioni, 2) del numero di elementi. Questo perchè qualsiasi tipo di elaborazione potrebbe inficiare sulla velocità di esecuzione della nostra applicazione.
Ad ogni modo, creare una funzione di questo tipo è relativamente semplice, perchè sarà necessario e sufficiente ciclare in tutte le dimensioni dell'array, dimensionando opportunamente i sotto elementi con il corretto numero di colonne, magari impostando le colonne aggiunte con valori di default, mentre eventuali colonne eliminate verranno perse.
Un oggetto di questo tipo, derivato da un'array base (ricordo INHERITS), dovrà avere proprietà interne apposite per i contatori delle varie dimensioni e, usandoli appunto come Property, creare proprio all'interno dei metodi relativi il codice per ridimensionare opportunamente l'array.

Spero di aver chiarito i concetti sulla creazione e l'uso degli array multidimensionali, facendo al contempo i miei complimenti per gli studi fatti da picavbg che, come ho notato più volte, ci mette davvero la testa per affrontare ogni problema che incontra, e che rende sempre pubblici i suoi sforzi. Spero che quanto da me sopra scritto, ti fornisca qualche elemento in più...  :ok:

Ciao

Offline Picavbg

  • Senatore Gambero
  • ******
  • Post: 1.620
    • Mostra profilo
Re: array bidimensionale a righe incrementabili
« Risposta #2 il: 22 Agosto 2012, 11:01:26 »
Grazie per il tuo apprezzamento.  Quando sono entrato in questa nostra comunità l'ho fatto convinto di parteciparvi con lo spirito di mettere a disposizione di tutti tutto quello che potevo imparare strada facendo. Ho cercato di comportarmi sempre così, poi tu sai benissimo che: il programmatore, data una serie di strumenti logici disponibili e dato un obiettivo da raggiungere, cerca di farlo con gli strumenti che conosce, fra quelli che ha a disposizione. Ogni percorso logico seguito per raggiungere l'obiettivo è buono e sempre migliorabile. Da quello che leggo spulciando le varie discussioni affrontate nel Forum, mi rendo conto che conosco assai poco. Un paio d'anni fa ho cominciato a studiare il linguaggio "C", ma poi l'ho tralasciato per mancanza di tempo. Vedo nelle tue risposte che sulle mie spalle grava sempre la lacuna del "C". Spero di riuscire in qualche modo a sottopormi ad una cura vitaminica.  :)
Il problema che mi si è presentato con gli array bidimensionali riguarda un argomento su cui ho cercato nel nostro Forum, nel suo wiki, nella documentazione ufficiale di Gambas ed in giro nel web e relativamente al quale ho trovato
Codice: [Seleziona]
DIM aResult AS NEW String[][12] ' Una matrice di matrici di stringhe!
, ma dopo avere cercato di capirne l'applicazione a 360° ho  fatto  le dovute prove, ma nessuna di esse è finita senza segnalazione di errore. Ho letto anche qualcosa sulla "Struttura degli arrays". Non riuscendo nell'intento ho deciso di abbandonare e seguire il mio istinto. Alla fine ce l'ho fatta, Può darsi che l'utilizzo che tu mi inviti a ristudiare sia più felice di quello messo in pratica da me, ma non è ancora alla mia portata.
Ciao.
:ciao:

Offline md9327

  • Moderatore
  • Senatore Gambero
  • *****
  • Post: 2.840
    • Mostra profilo
Re: array bidimensionale a righe incrementabili
« Risposta #3 il: 23 Agosto 2012, 16:32:39 »
Citazione
Può darsi che l'utilizzo che tu mi inviti a ristudiare sia più felice di quello messo in pratica da me, ma non è ancora alla mia portata.
In informatica si può raggiungere lo stesso obiettivo attraverso strade diverse, e non è detto che nel mio suggerimento sia inclusa la bibbia. Quello che intendevo è che possono esserci altre strade, ovviamente in base alle proprie conoscenze del linguaggio. I tuoi studi e test hanno avuto proprio l'obiettivo di trovarne una di strada, io ho solo messo il carico da 11, presupponendo altre, ovviamente basate sulla mia esperienza con gambas.

Citazione
sulle mie spalle grava sempre la lacuna del "C"
In realtà, la poca esperienza non è causata dal C. Sicuramente condiziona la mente nel conoscere più a fondo cosa vuol dire programmare, e prendere la strada migliore per risolvere i problemi. Ma quello che soprattutto permette di elaborare certi concetti è solo l'esperienza, fatta su svariati campi e con svariati linguaggi software, partendo dal linguaggio assembre su antichi processori. Io ho avuto la fortuna di lavorare per parecchi anni in vari ambienti, dal controllo dei satelliti, a quello di impianti meccanici, telecomunicazioni, fino alla creazione di gestionali, e l'uso di svariati motori di database. Molte delle problematiche che riscontro sono provocati dalle stesse cause, sia che si tratti di un programma Asm, sia che si tratti di Gambas (un esempio...).

Offline Picavbg

  • Senatore Gambero
  • ******
  • Post: 1.620
    • Mostra profilo
Re: array bidimensionale a righe incrementabili
« Risposta #4 il: 24 Agosto 2012, 13:10:53 »
In realtà, la poca esperienza non è causata dal C. Sicuramente condiziona la mente nel conoscere più a fondo cosa vuol dire programmare, e prendere la strada migliore per risolvere i problemi. Ma quello che soprattutto permette di elaborare certi concetti è solo l'esperienza, fatta su svariati campi e con svariati linguaggi software, partendo dal linguaggio assembre su antichi processori. Io ho avuto la fortuna di lavorare per parecchi anni in vari ambienti, dal controllo dei satelliti, a quello di impianti meccanici, telecomunicazioni, fino alla creazione di gestionali, e l'uso di svariati motori di database. Molte delle problematiche che riscontro sono provocati dalle stesse cause, sia che si tratti di un programma Asm, sia che si tratti di Gambas (un esempio...).
  Nel mio piccolo, anch'io ho tanta esperienza, ma solamente a livello di programmi applicativi e sempre dentro lo stesso buco aziendale. Conosco l'assembler perchè l'ho usato all'inizio della mia carriera (ricordo, e spero di non sbagliarmi, che fosse l'APS dell'Honeywell). Ho studiato il metodo di archiviazione dati nella struttura DB, ma non ho mai programmato in tali ambienti prima di conoscere Gambas, perchè, negli ultimi anni della mia carriera, ho dismesso l'abito del programmatore per indossare quello di analista di ambienti applicativi IBM. Ho dovuto perciò conoscere la logica gestionale dei DB. Ciò però sempre rivolto ad elaboratori di tipo Main Frame.
Ciò spiega anche come posso avere acquisita una certa esperienza nella logica di programmazione che però non è affiancata dalla conoscenza diretta di strutture di PC distribuiti in reti locali o connessi tramite web come rete internet o intranet. Anche se alla fine ho un bagaglio conoscitivo un pò limitato, è certo che non mi manca la voglia di imparare.
Alla fine però i nostri bagagli conoscitivi, sono e restano nostri e sicuramente ci servono e ci aiutano. La programmazione è fatta di studio, di conoscenza, di esperienze vissute, ma è fatta anche d'intuizione e, siccome  l'intuizione rappresenta il sale della programmazione, a volte, basta solo quest'ultima per risolvere problematiche che sono alla portata, ma senza  quel pò d'intuizione, nonostante tutte le conoscenze e l'esperienza acquisite, non arriva ed allora non è possibile ottenere la formula giusta per cantare vittoria. Meno male allora che il nostro Forum è frequentato anche da giovani che nel loro DNA personale hanno il benedetto talento dell'intuizione.
:ciao:

Offline md9327

  • Moderatore
  • Senatore Gambero
  • *****
  • Post: 2.840
    • Mostra profilo
Re: array bidimensionale a righe incrementabili
« Risposta #5 il: 24 Agosto 2012, 19:04:14 »
Posso non dirte che... bravo!!!  :ok:

Non sono però daccordissimo sul discorso dell'intuizione. E' vero che senza creado sia difficile andare avanti, ma è composto in parti uguali di genetica, esperienza e interesse nelle cose.

- L'esperienza ti dà modo di poter risolvere problemi comuni
- L'interesse e la voglia di conoscere le cose è basilare, altrimenti avremmo l'esperienza che permette solo di fare meccanicamente le stesse cose
- La genetica, nel senso che per certe cose devi esserci un pò nato, nell'arte è chiamata "avere la mano d'artista".

Tieni conto che su quest'ultimo punto nè ho ben conoscenza, dato che a suo tempo avevo la "mano d'artista", e infatti ho fatto il liceo artistico. La forma-mentis molto dinamica in questo caso ti permette di vedere le cose con un più ampio raggio. Di contro, però, avevo il pallino dell'elettronica, non tanto perchè nato per questo (avevo già la "mano"...), ma perchè vedevo nel campo elettronico grandi aperture verso l'ignoto, e quindi mi hanno preso la mano in quanto a me piaceva, e piace, molto conoscere di tutto.
Ovviamente non ho solo fatto questo... tanto per dirla una ho anche fatto il restauratore, il falegname, ecc...
Ora sono consulente di informatica, e lavoro sia come programmatore, che sistemista, analista, capo progetti, e via dicendo... Il problema è che lavoro in un ambito che vedo molto in crisi, non tanto per i soldi, quanto per la scarsità di stimoli... non dico di più, e ce ne sarebbe...  :-\

Ad ogni modo, qui in questo sito ho trovato molte persone con voglia di imparare e evolversi, e mi ci trovo bene.
Nel mio piccolo cerco anche io di dare una mano, mettendo la mia esperienza, e cercando al contempo di educare con concetti che spingano a far lavorare la logica, la fantasia e soprattutto le "mani" sulla tastiera. Non sono propenso a facili soluzioni, perchè a mio avviso non insegnano e forniscono solo la "pappa pronta". Come a volte mi puntualizza il caro vuott, quando rispondo ad alcuni post che hanno queste caratteristiche, ovvero cercare di avere solo i risultati senza sapere come è il procedimento per raggiungerli...  :D


Offline vuott

  • Moderatore globale
  • Senatore Gambero
  • *****
  • Post: 11.723
  • Ne mors quidem nos iunget
    • Mostra profilo
Re: array bidimensionale a righe incrementabili
« Risposta #6 il: 24 Agosto 2012, 19:08:49 »
.... cercando al contempo di educare con concetti che spingano a far lavorare la logica, la fantasia e soprattutto le "mani" sulla tastiera. Non sono propenso a facili soluzioni, perchè a mio avviso non insegnano e forniscono solo la "pappa pronta". Come a volte mi puntualizza il caro vuott, quando rispondo ad alcuni post che hanno queste caratteristiche, ovvero cercare di avere solo i risultati senza sapere come è il procedimento per raggiungerli...  :D

md9327 è stato sempre fedele e coerente in effetti con questa sua pedagogia.
« 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 Picavbg

  • Senatore Gambero
  • ******
  • Post: 1.620
    • Mostra profilo
Re: array bidimensionale a righe incrementabili
« Risposta #7 il: 18 Ottobre 2012, 16:46:34 »
.... cercando al contempo di educare con concetti che spingano a far lavorare la logica, la fantasia e soprattutto le "mani" sulla tastiera. Non sono propenso a facili soluzioni, perchè a mio avviso non insegnano e forniscono solo la "pappa pronta". Come a volte mi puntualizza il caro vuott, quando rispondo ad alcuni post che hanno queste caratteristiche, ovvero cercare di avere solo i risultati senza sapere come è il procedimento per raggiungerli...  :D

md9327 è stato sempre fedele e coerente in effetti con questa sua pedagogia.

Riprendo l'argomento perché, sul concetto pedagogico di md9327 vorrei esprimere la mia modesta opinione. Direi che per grandi linee la teoria di md9327 é corretta e molto educativa. Infatti l'acquisizione di una conoscenza dopo averne vissuto l'esperienza é sicuramente il risultato di una saldatura assolutamente permanente, però a volte quanto costa in termini di tempo arrivare al risultato? L'esperienza si può fare ugualmente ed anche bene se la  spintarella concettuale, con la tecnica "te lo dico implicitamente nel mio ragionamento, ma non t'imbocco",  può costare tempo perché non sempre é semplice arrivare alla soluzione; intanto bisogna capire quello che md9327 ha voluto dire nel suo ragionamento, ma molto spesso non si hanno le conoscenze giuste per indovinare la soluzione contenuta in quel ragionamento-indovinello. Può però succedere che il misero richiedente aiuto, non sapendo che strada seguire, dopo avere invano cercato di trovare la svolta giusta, si stanchi ed abbandoni il percorso che voleva fare.
Risultato: La soluzione non é stata trovata e, soprattutto, non é stata comunicata alla comunità; il richedente, non avendo ricevuto l'aiuto che sperava, non ha fatto esperienza e non ha acquisito la conoscenza che cercava.
Io credo che un aiuto non debba essere costituito direttamente a livello elementare, pronto all'uso, ma debba quantomeno essere spiegato come arrivare in breve tempo alla soluzione; poi, nei post successivi, collaborando col richiedente, si può correggere ulteriormente l'idea che lo stesso sia andato formando.
 :ciao:
:ciao:

Offline vuott

  • Moderatore globale
  • Senatore Gambero
  • *****
  • Post: 11.723
  • Ne mors quidem nos iunget
    • Mostra profilo
Re: array bidimensionale a righe incrementabili
« Risposta #8 il: 18 Ottobre 2012, 17:41:52 »
Be'... anche il tuo ragionamento è condivisibile.

Certo è che, come mi pare tu lasci intendere, una via di mezzo è forse la più opportuna ed adeguata, poiché un insegnamento - come dire ? - "esplicativo", "dettagliato", utile sì a trasmettere rapidamente e con sicurezza le conoscenze, avrebbe senso se spiegasse aspetti teorici e basilari di un argomento. Poiché la maggior parte delle volte nel forum si chiede la soluzione di un problema concreto, applicativo, una spiegazione dettagliata diventa inevitabilmente pappa pronta. Pappa che, se non supportata da un minimo di spiegazione, resta, a chi la legge, qualcosa di funzionante, ma dal funzionamento non compreso. Ecco  :-\ perché, ad esempio, quando do un mio apporto, cerco di spiegarne, seppur brevemente, i passaggi come commenti al codice.
« 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 md9327

  • Moderatore
  • Senatore Gambero
  • *****
  • Post: 2.840
    • Mostra profilo
Re: array bidimensionale a righe incrementabili
« Risposta #9 il: 18 Ottobre 2012, 19:20:48 »
Anche tu hai ragione, per certi versi.
Io non ho mai detto esplicitamente che non si debba dare un aiuto, per così dire, esplicito, ma solo che a volte, per svogliatezza, o per mancanza di provare prima l'idea con i propri mezzi, si passa subito a chiedere.
E' sottinteso che, se una logica non viene capita, o intesa male, è giusto chiedere in relazione ai dubbi che uno ha, magari chiedendo anche un esempio concreto. E' anche ovvio che non si può chiedere di risolvere completamente un'idea, fornendo pure il codice completo.
Quello che tento di fare, o di divulgare, è che per raggiungere un fine/scopo in informatica le strade possono essere molteplici.
Io posso fornire, a seconda delle mie conoscenze, fatte poi sul campo e sulla mia pelle, spunti e idee per risolvere un dato quesito, o fornire lumi per quanto riguarda un determinato comporamento di un componente e/o metodo, ma la cosa, secondo me, deve terminare lì...
Stà poi al richiedente, sviluppare quanto appreso, provando e riprovando, e magari riporre un'ulteriore quesito, ma in questo caso più mirato.
Devo anche dire che io non mi esprimo molto bene, e a volte certi concetti non riesco a spiegarli tali da renderli comprensibili a tutti. Non è perchè io sono un guru, ci mancherebbe... ma è che mi esprimo più con i fatti.
Molte delle conoscenze ed esperienze fatte, a parte anche con altri linguaggi, con gambas, sono inclusi e concentrati nei miei progetti. Ed è per questo che invito sempre a scaricare i miei programmi, che hanno lo scopo principale di sviluppare il più possibile quanto offre gambas.

Ritornando a monte, sulla richiesta iniziale, possiamo andare a specificare maggiormente cosa volevi ottenere, cosa intendevo io per gestione multiarray, e via dicendo, senza andare sulla critica, in quanto oltre che non produttiva, non è utile a nessuno, e il comportamento in risposta di ognuno di noi non può essere soggetto a analisi e critiche varie.

Comunque, dato che ora sono a casa, e ho un pò di tempo da dedicare a leggere e cercare di rispondere in aiuto alle varie discussioni, posso cercare di specificare meglio i concetti che ho cercato di sintetizzare inizialmente.

Gambas ha vari tipi di variabile, tra cui la possibilità di gestire delle collezioni di dati, in questo caso vengono in aiuto gli array.
Per definizione generale, e per scelta dell'ideatore di gambas, sono presenti array di tipo monodimensionale, ovvero una colonna per riga e quindi un dato per riga, e array multidimensionali, ovvero più colonne per singola riga.
Oltre agli array è presente anche un'altro tipo, anzi una classe, che è Collection, che gestisce una array indicizzato per chiave. Andando a leggere la documentazione, si puà associare una colonna con un nome chiave. Questo oggetto è utile in quei casi in cui vogliamo identificare univocamente una colonna.
Gli array dispongono di tutti i metodi necessari per gestire in modo dinamico i dati ivi contenuti, come ad esempio l'aggiunta, l'inserimento, l'eliminazione o la modifica dei suoi elementi. Quindi è possibile dimensionare dinamicamente un array.
Di array ce ne sono di tipo diverso, e mediamente si basano sui tipi base: Integer, Byte, Boolean, Long, ecc.
Ricordo che tra i tipi base c'è anche il Variant. Questo è un tipo particolare, che ci permette di definire valori di vario tipo (si chiama appunto Variant), anche nello stesso array. Quindi, utilizzando un Variant[], potremmo inserirgli valori Integer, Boolean o Long, per singola cella, o canbiare una cella con un valore di tipo diverso. Questo ci permette di fare molte cose, tra cui pure memorizzare oggetti insieme a tipi base, Integer con TextBox, e via dicendo. Stà poi al programma capire di che tipo è una determinata cella, e agire di conseguenza (vedi Object.Type() o TypeOf()).

Detto questo, a questo punto abbiamo due alternative, dipendentemente dallo scopo, ovvero possiamo usare gli array base forniti da gambas, oppure creare oggetti che ampliano le funzionalità di questi tipi base, o che gestiscono in modo diverso una serie di dati, misti o di stesso tipo.

L'altra alternativa è l'uso degli oggetti. La cosa non porta fuori discorso, in quanto gli array sono oggetti essi stessi.
Tramite una classe specializzata, possiamo gestire dati in modo dinamico, come anche subarray.
Gambas offre molte funzionalità per creare oggetti di tipo array, e in PgDesigner3 (per esempio) li uso a man bassa.
Secondo lo scopo, io di solito creo una classe, che al suo interno ha una variabile array. Tramite le funzioni nascoste di gambas, è possibile usare la classe proprio come un array, e gestire i suoi elementi come più ci piace. Oltre a questo possiamo inserire eventi, proprietà particolari, metodi specializzati, adatti allo scopo che ci prefiggiamo di ottenere.

Giusto per dare qualche spunto, anche perchè descrivere la cosa a livello di codice sarebbe troppo onerosa, allego un paio di classi contenute in PgDesigner, che uso per gestire le impostazioni/setting del programma.
Le classi contenute nello zip, mi permettono di gestire un array di gruppi (PgConfigGroup) di item (PgConfigItem). Come si può notare nella classe dei gruppi, è l'uso dei metodi nascosti: _get(), _put() e _next(), che permettono di usare la classe come un array di gambas, ovverro puntare ad un elemento tramite un indice (es. group[3] = xyz), oppure scorrere l'array con le istruzioni fornite da gambas (FOR EACH item in group, dove item è di tipo PgConfigItem).

Tanto per aggiungere carne sul fuoco, all'inizio delle classi, si può notare l'uso di altri metodi nascosti: _call(), _new(), _free() e _unknown().

Il primo metodo permette di usare la classe come fosse una funzione, ovvero ritorna una nuova istanza della classe, basta usarla così:
Codice: [Seleziona]
DIM pippo AS PgConfigGroup = PgConfigGroup("xyz","zyx")
...
altrimenti
...
DIM pippo AS New PgConfigGroup("xyz","zyx")

Il secondo e il terzo metodo identificano rispettivamente il costruttore e il distruttore della classe. Questi due metodi vengono chiamati (indipendentemete se dichiarati esplicitamente nel codice o meno) da gambas, rispettivamente quanto l'oggetto viene creato e distrutto. Nel primo metodo, si possono quindi definire e impostare i valori base e le proprietà dell'oggetto, e questo anche se è un'oggetto grafico (es. una Form). La seconda classe è utilizzabile per pulire determinate situazioni (es. una connessione), che magari non sono state completate correttamente a causa di un'errore nella classe.

Il terzo metodo viene chiamato quando, ad esempio, si esegue una chiamata ad una proprietà o metodo inesistenti nell'oggetto, chiamati da un pezzo esterno di programma, o anche dalla stessa classe. Negli esempi che ho postato, uso questo metodo per scatenare degli eventi che verranno catturati da codice superiore per, per esempio, emettere un messaggio di warning, o loggare la situazione in un file di log.

Non sò se tutto quanto scritto sopra abbia in qualche modo spiegato alcuni dubbi. Magari, sull abase di queste informazioni, si può tentare di dare spiegazioni più particolareggiate su dubbi più specifici.

Offline vuott

  • Moderatore globale
  • Senatore Gambero
  • *****
  • Post: 11.723
  • Ne mors quidem nos iunget
    • Mostra profilo
Re: array bidimensionale a righe incrementabili
« Risposta #10 il: 18 Ottobre 2012, 23:07:40 »
E' sottinteso che, se una logica non viene capita, o intesa male, è giusto chiedere in relazione ai dubbi che uno ha, magari chiedendo anche un esempio concreto. E' anche ovvio che non si può chiedere di risolvere completamente un'idea, fornendo pure il codice completo.
Quello che tento di fare, o di divulgare, è che per raggiungere un fine/scopo in informatica le strade possono essere molteplici.
Io posso fornire, a seconda delle mie conoscenze, fatte poi sul campo e sulla mia pelle, spunti e idee per risolvere un dato quesito, o fornire lumi per quanto riguarda un determinato comporamento di un componente e/o metodo, ma la cosa, secondo me, deve terminare lì...
Stà poi al richiedente, sviluppare quanto appreso, provando e riprovando, e magari riporre un'ulteriore quesito, ma in questo caso più mirato.
Devo anche dire che io non mi esprimo molto bene, e a volte certi concetti non riesco a spiegarli tali da renderli comprensibili a tutti. Non è perchè io sono un guru, ci mancherebbe... ma è che mi esprimo più con i fatti.
Molte delle conoscenze ed esperienze fatte, a parte anche con altri linguaggi, con gambas, sono inclusi e concentrati nei miei progetti. Ed è per questo che invito sempre a scaricare i miei programmi, che hanno lo scopo principale di sviluppare il più possibile quanto offre gambas.

Non so se si è capito. Forse non tutti sanno che questa parte è tratta dal volume:

 md9327 - Trattato di Pedagogia informatica - Edizioni Gambas-it.org
 
      ;D
« 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 dex

  • Gran Maestro dei Gamberi
  • *****
  • Post: 872
    • Mostra profilo
Re: array bidimensionale a righe incrementabili
« Risposta #11 il: 01 Settembre 2013, 15:28:00 »
Allora, non per smontare il tuo bel lavoro di studio, ma gli array multidimensionali si possono fare, anche se in modo diverso da come hai tentato di fare.

E' vero che gli array di base String[], Integer[], ecc. hanno la possibilità di essere creati come array multimensionali, ma si può fare anche in altro modo, ovvero usando i Variant.

Il Variant è un oggetto che può contenere valori di diverso tipo. La tipologia dei valori può essere diversa anche tra i valori nella stessa colonna, ma ad ogni modo il concetto che vado a descrivere è quello dell'uso con la multimensionalità.

Anche per il Variant esiste un oggetto array, appunto Variant[], che non è altro che un array di valori di vario tipo. Però, dato che il Variant stesso può contenere un array come valore unico, l'utilità è puramente estetica.

Ad ogni modo, mettiamo di voler memorizzare una serie di numeri (potrebbero essere stringhe, ma il concetto è lo stesso...).
A questo punto andiamo a creare una array Variant[] che, come da sintassi Gambas, può essere creato vuoto, quindi senza alcun elemento.
Mettiamo di voler creare un array bidimensionale (il concetto poi si può propagare all'infinito...), contenente appunto una serie di numeri.
Dato che l'array multidimensionale, per come è fatto, ha come indice solamente la posizione del valore interno all'array, ogni elemento và indirizzato con la proprietà Index (comune a tutti gli array). L'aggiunta di elementi può essere fatta con il metodo Add(), oppure con il metodo Insert() (quest'ultimo ha la possibilità di inserire elementi in un punto specifico, non appeso alla fine dell'array come di default).
In questo modo avremo un'array di numeri, molto simile ad un'array di Integer[] (ad esempio...).

Mettiamo di voler invece creare un'array con un ulteriore livello.
Per fare questo è sufficiente creare un'array Variant[] in ogni elemento dell'array padre: <Variant[]>.Add(<Variant[]>).
Questa logica può essere applicata all'infinito.

L'unico neo di questo metodo, è che se si và a modificare in runtime la struttura di un'array multidimensionale, potremmo avere elementi con numero di colonne non allineate, ovvero ad esempio, avere l'elemento 0 con un valore, e l'elemento 1 con 3/3 valori.
In questo caso, non sono stati previsti metodi per compensare un disallineamento di questo tipo, e si dovrà ricorrere per forza ad una funzione apposita, o derivare la classe array in un nuovo oggetto/classe che ha la funzione appropriata.

Per costruire questo tipo di funzione, si dovrà tener conto: 1) del numero di dimensioni, 2) del numero di elementi. Questo perchè qualsiasi tipo di elaborazione potrebbe inficiare sulla velocità di esecuzione della nostra applicazione.
Ad ogni modo, creare una funzione di questo tipo è relativamente semplice, perchè sarà necessario e sufficiente ciclare in tutte le dimensioni dell'array, dimensionando opportunamente i sotto elementi con il corretto numero di colonne, magari impostando le colonne aggiunte con valori di default, mentre eventuali colonne eliminate verranno perse.
Un oggetto di questo tipo, derivato da un'array base (ricordo INHERITS), dovrà avere proprietà interne apposite per i contatori delle varie dimensioni e, usandoli appunto come Property, creare proprio all'interno dei metodi relativi il codice per ridimensionare opportunamente l'array.

Spero di aver chiarito i concetti sulla creazione e l'uso degli array multidimensionali, facendo al contempo i miei complimenti per gli studi fatti da picavbg che, come ho notato più volte, ci mette davvero la testa per affrontare ogni problema che incontra, e che rende sempre pubblici i suoi sforzi. Spero che quanto da me sopra scritto, ti fornisca qualche elemento in più...  :ok:

Ciao

raga riprendo questa vecchia discussione in quanto dovrei creare un array multidimensione con vari dati

una cosa del tipo
Codice: [Seleziona]
Dim MyArray as new Variant[]
Dim i, x as integer
Dim  y as float
Dim p as string

p = 'arriva da un ciclo
x = 'arriva da un'altra variabile
y = 'arriva da un'altra variabile

for i = 0 to 25

      MyArray.add(p,  i,  x, y) 'qui non riesco a capire come caricare i dati

next



Offline vuott

  • Moderatore globale
  • Senatore Gambero
  • *****
  • Post: 11.723
  • Ne mors quidem nos iunget
    • Mostra profilo
Re: array bidimensionale a righe incrementabili
« Risposta #12 il: 01 Settembre 2013, 15:49:32 »
Codice: [Seleziona]
for i = 0 to 25

      MyArray.add(p,  i,  x, y) 'qui non riesco a capire come caricare i dati

next

...ovviamente devi andare ad individuare ogni singolo... nodo della rete righe/colonne. Puoi vedere qui
http://www.gambas-it.org/wiki/index.php?title=Matrici_%28Vettori_multidimensionali%29_definite
degli esempi (anche se con matrici a dimensioni definite). Poiché la tua matrice non ha una quantità di elementi definiti, per farne aumentare appunto la quantità proporrei uno sguardo anche a quest'altra pagina:
http://www.gambas-it.org/wiki/index.php?title=Array_dinamici_%E2%80%93_creazione_e_riempimento

Trattandosi, da quel che vedo, di valori di tipo differente, potresti anche utilizzare una Struttura con campi vettoriali:
http://www.gambas-it.org/wiki/index.php?title=Strutture:_dichiarazione_ed_uso#Strutture_contenenti_Vettori_e_Matrici
« Ultima modifica: 29 Dicembre 2013, 20:01:31 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 dex

  • Gran Maestro dei Gamberi
  • *****
  • Post: 872
    • Mostra profilo
Re: array bidimensionale a righe incrementabili
« Risposta #13 il: 02 Settembre 2013, 00:32:20 »
Codice: [Seleziona]
for i = 0 to 25

      MyArray.add(p,  i,  x, y) 'qui non riesco a capire come caricare i dati

next

...ovviamente devi andare ad individuare ogni singolo... nodo della rete righe/colonne. Puoi vedere qui
http://www.gambas-it.org/wiki/index.php?title=Matrici_ed_Array_multidimensionali_definiti
degli esempi (anche se con matrici a dimensioni definite). Poiché la tua matrice non ha una quantità di elementi definiti, per farne aumentare appunto la quantità proporrei uno sguardo anche a quest'altra pagina:
http://www.gambas-it.org/wiki/index.php?title=Array_dinamici_%E2%80%93_creazione_e_riempimento

Trattandosi, da quel che vedo, di valori di tipo differente, potresti anche utilizzare una Struttura con campi vettoriali:
http://www.gambas-it.org/wiki/index.php?title=Strutture:_dichiarazione_ed_uso#Strutture_contenenti_Vettori_e_Matrici

ancora una volta grazie vuott
ho risolto

Offline allegfede

  • Gran Maestro dei Gamberi
  • *****
  • Post: 738
    • Mostra profilo
Re: array bidimensionale a righe incrementabili
« Risposta #14 il: 11 Ottobre 2013, 11:50:06 »
grazie ragazzi, il link segnalato per la pagina wiki:
http://www.gambas-it.org/wiki/index.php?title=Strutture:_dichiarazione_ed_uso#Strutture_contenenti_Vettori_e_Matrici

mi ha permesso di velocizzare molto un pezzo del mio progetto OTVA
se corri, morirai stanco (motto degli sniper)