Autore Topic: Dati aggregati  (Letto 1995 volte)

Offline Gianluigi

  • Moderatore globale
  • Senatore Gambero
  • *****
  • Post: 4.158
  • Tonno verde
    • Mostra profilo
Dati aggregati
« il: 26 Ottobre 2014, 23:06:37 »
Ciao a tutti,
mi sto picchiando con dei concetti che nella mia precedente vita di piccolo programmatore VBA non avevo mai affrontato.
Io inizialmente d'acchito avevo archiviato nel mio cervelletto le strutture sotto la voce UDT vale a dire il tipo definito dall'utente; ma è poi veramente così?
Dico archiviate perché dato i limiti del mio comprendonio già all'epoca le avevo escluse dai miei programmi che essendo principalmente utility fatte in Excel o aggiunte in Acces avevo pensato ne potessero tranquillamente (?) fare a meno.
Vedo che in Gambas ci sono diversi tipi di dati aggregati:
Le già citate Strutture
Gli Array
Le Collezioni
Cosa mi dimentico? Gli Oggetti? Ma su quelli soprassiederei. Altro?
Ora dirò la mia idiozia della sera: Io non capisco proprio perché se esistono i database di qualunque tipo, anche leggerissimi come SQLite, occorra ricorrere ad altre forme di aggregazione.
Vedo che addirittura Gambas supporta i puntatori che sebbene io fondamentalmente non comprenda tuttavia so o credo di sapere che servono per manipolare i dati memorizzati attraverso gli indirizzi di memoria e quindi rimaniamo sempre nel campo.
Li fuori c'è qualche anima pia che mi vuole schiarire le idee?
Grazie dell'attenzione
 :ciao:
nuoto in attesa del bacio di una principessa che mi trasformi in un gambero azzurro

Offline vuott

  • Moderatore globale
  • Senatore Gambero
  • *****
  • Post: 11.317
  • Ne mors quidem nos iunget
    • Mostra profilo
Re: Dati aggregati
« Risposta #1 il: 29 Ottobre 2014, 00:43:22 »
Vedo che addirittura Gambas supporta i puntatori che sebbene io fondamentalmente non comprenda tuttavia so o credo di sapere che servono per manipolare i dati memorizzati attraverso gli indirizzi di memoria e quindi rimaniamo sempre nel campo.

Un esempio di uso pratico dei Puntatori in Gambas:
http://www.gambas-it.org/smf/index.php?topic=3762.msg34306
« 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.158
  • Tonno verde
    • Mostra profilo
Re: Dati aggregati
« Risposta #2 il: 29 Ottobre 2014, 12:20:31 »
Un esempio di uso pratico dei Puntatori in Gambas:
http://www.gambas-it.org/smf/index.php?topic=3762.msg34306

Grazie, scaricato.
Ora vado a studiare
 :ciao:
nuoto in attesa del bacio di una principessa che mi trasformi in un gambero azzurro

Offline vuott

  • Moderatore globale
  • Senatore Gambero
  • *****
  • Post: 11.317
  • Ne mors quidem nos iunget
    • Mostra profilo
Re: Dati aggregati
« Risposta #3 il: 29 Ottobre 2014, 12:23:30 »
In vero, va ricordato che i Puntatori in Gambas sono utilizzati in modo particolare laddove richiesto dalla gestione con Extern delle funzioni di librerie esterne.
« 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.158
  • Tonno verde
    • Mostra profilo
Re: Dati aggregati
« Risposta #4 il: 29 Ottobre 2014, 18:12:51 »
In vero, va ricordato che i Puntatori in Gambas sono utilizzati in modo particolare laddove richiesto dalla gestione con Extern delle funzioni di librerie esterne.

Accidenti e pensare che di Extern & C avevo già letto le tue lezioni; è che mi è bastato fare una breve pausa di 100 giorni e il mio cervello ha già fatto reset.
Poi comunque ho commesso l'errore di cercare solo (!?) nelle discussioni che se le fai troppo particolari rischi di non ottenere nulla e al contrario ottieni “troppo”.
Andando a cercare nel wiki ho ripescato anche altre lezioni per usare i Memory Stream per leggere e scrivere nelle strutture coi puntatori ecc.
E il bello che ho appena letto la tua ultima lezione sempre sui Memory Stream!
Vediamo se per caso ho compreso qualcosa in più su concetti che continuano a rimanermi a dir poco indigesti.
Gambas per ampliare le proprie possibilità supporta i Puntatori che permettono ai programmatori di accedere alle librerie esterne scritte in C (C++?)e poterne usare le funzioni.
Ora, nella giusta filosofia hacker tali puntatori vengono usati per scrivere e leggere in altre “funzioni” di Gambas aventi comunque loro precipue modalità?
Se così fosse ho qualcosa in meno da capire con urgenza. Perdonami ma per me lo studio del C per adesso è rimandato almeno di un paio d'anni e vista l'età...
Oppure trattasi diciamo così di “normale utilizzo” cosa che mi lascerebbe attonito e affranto?
Grazie
 :ciao:
nuoto in attesa del bacio di una principessa che mi trasformi in un gambero azzurro

Offline vuott

  • Moderatore globale
  • Senatore Gambero
  • *****
  • Post: 11.317
  • Ne mors quidem nos iunget
    • Mostra profilo
Re: Dati aggregati
« Risposta #5 il: 29 Ottobre 2014, 20:57:45 »
Ora, nella giusta filosofia hacker tali puntatori vengono usati per scrivere e leggere in altre “funzioni” di Gambas aventi comunque loro precipue modalità?

Per quel che riguarda il C l'uso dei Puntatori nei codici, scritti in questo linguaggio, è estremamente frequente. A volte vi sono funzioni che richiedono, come parametri, proprio dei Puntatori; e moltre volte ritornano un Puntatore.
...ma come si fa a leggere o a scrivere in un'area riservata, puntata da una variabile di tipo Puntatore ?  Gambas usa uno stratagemma, rappresentato dai "Memory Stream".
Ad esempio per scrivere in un Puntatore (rectius: all'interno di un'area puntata da un Puntatore), dopo aver generato una variabile di tipo Stream dal Puntatore, si utilizza questa variabile per scriverci dentro. Fatto ciò, però, alla funzione esterna, che pretende che sia passato come argomento un Puntatore, si passerà la varibile di tipo Puntatore e non la variabile Stream (da essa generata e da noi utilizzata per scrivere nell'area riservata di memoria).

Insomma, va tenuto a mente che sostanzialmente il Puntatore punta ad un'area riservata di memoria, nella quale - con Gambas - è possibile leggere o scrivere mediante i Memory Stream.
Un'area riservata di memoria può essere definita con la funzione: alloc(), e vi si potrà - ad esempio - scrivere secondo questa procedura astratta:
Codice: gambas [Seleziona]
Public Sub Main()

  Dim p As Pointer
  Dim st As Stream

' Riserviamo un'area di memoria di 64 byte, il cui indirizzo è puntato dalla variabile "p":
   p = Alloc(64)

' Generiamo dalla variabile "Puntatore" una variabile di tipo "Stream", ad esempio per scrivere nell'area riservata:
   st = Memory p For Write

' Scriviamo dunque dentro l'area riservata di memoria, come se agissimo in un File:
   Write #st, "Gambas\x0AGambas"

' Chiudiamo il flusso:
   st.Close

' Qui, ad esempio, passiamo il puntatore alla funzione esterna che richiede come argomento un Puntatore
' ad un'area di memoria riservata, nella quale sia stata scritta la stringa di cui sopra:
   Funzione_Esterna(p)

' Poiché abbiamo allocato 64 byte di memoria, ora, che non serve più, la liberiamo:
   Free(p)

End



Per generare, invece, un Puntatore da un altro tipo di variabile (quindi per creare un Puntatore che punta all'indirizzo di memoria di una variabile), si fa uso della funzione: VarPtr() .



Più in generale i Puntatori ci consentono, anche in Gambas, di operare all'interno di un'area di memoria, allocata da noi oppure allocata da un'altra risorsa. Vediamo al riguardo questo semplice esempio.
Leggiamo e cambiamo un carattere di una stringa contenuta in una variabile di tipo Stringa:
Codice: gambas [Seleziona]
Public Sub Main()

  Dim p As Pointer
  Dim st As Stream
  Dim s As String
  Dim j, b As Byte


 ' Assegnamo del testo alla variabile di tipo "String":
   s = "gambas"

' Assegnamo l'indirizzo di memoria della variabile "s" ad una variabile di tipo Puntatore:
   p = VarPtr(s)

' Generiamo dalla variabile "Puntatore" una variabile di tipo "Stream" in lettura ed in scrittura:
   st = Memory p For Read Write

' Andiamo a vedere mediante la variabile di tipo "Stream" i valori presenti all'interno
' dell'area di memoria della variabile "s", puntata dal puntatore:
   For j = 0 To String.Len(s) - 1
     Read #st, b
     Print Hex(b), b, Chr(b)
   Next

' Scriviamo ora un valore (ad esempio il carattere di "fine riga a capo") nel quarto byte
' (di indice 3) dell'area di memoria puntata dalla variabile "s", a sua volta puntata dal puntatore:
   Seek #st, 3
   Write #st, &0A As Byte

' Chiudiamo il flusso:
   st.Close

' ...vediamo direttamente dalla variabile stringa "s" la modifica apportata:
   Print s

End
« Ultima modifica: 30 Ottobre 2014, 00:00:38 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.158
  • Tonno verde
    • Mostra profilo
Re: Dati aggregati
« Risposta #6 il: 30 Ottobre 2014, 20:36:12 »

Ciao vuott,
scusa per il ritardo nel rispondere alla tua interessantissima lezione, purtroppo ho avuto da fare ed è da non molto che mi sono messo a studiarla.
Vediamo quindi se ho capito, ma ho forti dubbi:
Il puntatore nasce principalmente per permetterci di usare librerie pronte scritte in C.
Visto che ci sono i puntatori coloro i quali conoscendo il C e sanno come usarli ne approfittano per il codice “interno”.
Anche chi non conosce il C può usufruirne all'interno come mi hai fatto vedere nella seconda dimostrazione pratica.
Mi stavo chiedendo se quando noi passiamo i valori a una funzione, che se non sbaglio in Gambas vengono passati per valore, in realtà Gambas non usi un puntatore. Se fosse vero Gambas ci fa usare i puntatori ma ce lo nasconde e invece se li passiamo per riferimento?
Io comunque ho difficoltà ad immaginarmeli in quanto essi se capisco bene sono al contempo “indirizzo” e “contenitore”.
Se una variabile diciamo così normale la possiamo paragonare ad una scatola (di varie misure in base al tipo) con un'etichetta di indirizzo, il puntatore cosa è? E' un locomotore (indirizzo) che si può trascinare dei vagoni che all'occorrenza riempe?

Per meglio comprendere il tuo esempio (il secondo) ho provato a riprodurlo in codice “normale” ma ottengo un errore puoi per favore dirmi dove sbaglio?
Codice: gambas [Seleziona]

     Dim c, s As String 
     Dim j, b As Byte       
   
      s = "gambas"       
   
      For j = 1 To String.Len(s)
        c = Mid$(s, j, 1)
        'b = CByte(c)  ' Type mismatch: wanted Byte, got String instead
        'Print Hex(b), b, c           
      Next 
      c = Mid$(s, 4, 1)
      s = Replace$(s, c, Chr$(10))   
      Print s 

Parliamoci chiaro mi rendo conto di approfittare molto delle tue abilità e se non rispondi ti capisco benissimo.
Se però mi rispondi sappi che io apprezzo molto.
Ciao e scusa anche la mia testa dura.
 :ciao:
nuoto in attesa del bacio di una principessa che mi trasformi in un gambero azzurro

Offline Top Fuel

  • Gran Maestro dei Gamberi
  • *****
  • Post: 960
    • Mostra profilo
Re: Dati aggregati
« Risposta #7 il: 30 Ottobre 2014, 23:01:18 »
Ti da errore perchè tenti di tirare fuori un valore Byte da una stringa. Usando Asc al posto di CByte non mi da più errore, però non mi visualizza nulla lo stesso nella console, e questo non lo so nemmeno io il perchè... :-\
Dear youtube administrators, your search bar is broken. When I type the letter "J" it appears justin bieber when it should appear Jimi Hendrix. Fix this, please.

Offline vuott

  • Moderatore globale
  • Senatore Gambero
  • *****
  • Post: 11.317
  • Ne mors quidem nos iunget
    • Mostra profilo
Re: Dati aggregati
« Risposta #8 il: 31 Ottobre 2014, 01:25:47 »
...essi se capisco bene sono al contempo “indirizzo” e “contenitore”.
Se una variabile diciamo così normale la possiamo paragonare ad una scatola (di varie misure in base al tipo) con un'etichetta di indirizzo, il puntatore cosa è? E' un locomotore (indirizzo) che si può trascinare dei vagoni che all'occorrenza riempe?
......restando alla tua similitudine, poniamo il caso che la scatola della variabile "normale" è posta sul terzo ripiano di una credenza alla 4a posizione fra le altre scatole di quel ripiano. Ebbene,  il Puntatore, è una scatola nella quale c'è un foglietto sul quale c'è scritto: "Se prendi la scatola posta sul terzo ripiano alla 4a posizione  fra le altre scatole di quel ripiano, al suo interno troverai un valore.". Oppure, se vuoi, possiamo dire che Genova è la variabile "normale" che contiene persone e palazzi ed il porto. Il Puntatore è il cartello stradale che indica la strada
 < km 100 Genova]
...o meglio una mappa che indica le coordinate geografiche del centro della città.



ottengo un errore puoi per favore dirmi dove sbaglio?
Ti ha risposto bene l'amico TopFuel: la funzione Mid() ti restituisce semplicemente un carattere. Per gestire questo carattere con la funzione CByte(), devi convertirlo mediante la funzione Asc() nel corrispondente valore numerico ASCII.
Insomma così:
Codice: gambas [Seleziona]
...... 
  c = Mid$(s, j, 1)
  b = CByte(Asc(c))
......
« Ultima modifica: 31 Ottobre 2014, 16:22: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 vuott

  • Moderatore globale
  • Senatore Gambero
  • *****
  • Post: 11.317
  • Ne mors quidem nos iunget
    • Mostra profilo
Re: Dati aggregati
« Risposta #9 il: 31 Ottobre 2014, 01:38:44 »
Ancora sull'uso della risorsa Memory Stream con i Puntatori.
Se ci si riflette bene, con tale risorsa è possibile scrivere una procedura per crearsi un tipo di variabile (ossia di area di memoria riservata di dimensione ben definita) dalla dimensione che vogliamo, nella quale leggere e scrivere.
Così, dunque, ad esempio possiamo crearci una variabile (ossia un'area di memoria riservata) di 7 Byte; oppure più ampia nella quale scrivere più dati a mo' di array.
La funzione Alloc(), quindi, unitamente ai Memory Stream è una risorsa per nulla conosciuta, ma molto imteressante e stimolante, poiché ci consente l'accesso diretto in lettura ed in scrittura alla memoria.
Per il rapporto funzione Alloc() e Puntatori rinvio a questa pagina della nostra Wiki:
http://www.gambas-it.org/wiki/index.php?title=Assegnare_ad_un_Puntatore_un%27area_di_memoria_riservata_con_Alloc%28%29


Guardate come è possibile tenere in pugno una Struttura con i Memory Stream:
http://www.gambas-it.org/wiki/index.php?title=Assegnare_valori_ad_una_Struttura_mediante_i_Memory_Stream
Con le variabili Stream è possibile sia leggere che scrivere nelle Strutture... le quali, del resto, non sono altro anch'esse che aree di memoria riservate.
« Ultima modifica: 06 Novembre 2014, 15:56:58 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.158
  • Tonno verde
    • Mostra profilo
Re: Dati aggregati
« Risposta #10 il: 31 Ottobre 2014, 15:43:55 »
Grazie vuott,
Ti svelo perché sono a porre in questo modo certe domande.
Devi sapere che sono ormai più di 15 giorni (10 in realtà poi il primo intoppo) che con alacrità mi sono messo a scrivere un manualetto. Lo so di non sapere ma è anche vero che se uno in Linux non trova quel che vorrebbe trovare l'unica via che ha è quella di farlo lui.
Comunque mi sono detto “ora inizio e poi vediamo... se qualcosa non capisco ho due chance; chiedo; se mi viene risposto uso la risposta nel manuale, altrimenti lascio in sospeso e poi quando proporrò il tutto spero in un aiutino”. Mi sono già arenato sui chiamiamoli così Dati Aggregati & C e come vengono usati in Gambas.
In realtà ci sarebbe anche una terza via “rinunciare” ma questo è contrario ai miei principi.
Non fraintendere non sono così avanti, sono solo alla carrellata iniziale l'infarinatura prima di partire!
Questa cosa è mirata a persone che non hanno mai programmato, che mi guarderei bene dal scrivere qualcosa di diverso e spero non venga interpretato come un atto di presunzione.
Mi servirà anche, se non sopratutto, per confrontarmi con me stesso e quello che so o credo di sapere (poco in verità).
Ad esempio essendo io rimasto al calduccio di Office il massimo di abilità era l'uso dell'oggetto application. Quando avevo bisogno di memorizzare i dati avevo a disposizione le tabelle di access o excel lo so che anche se disegnate in quella forma in realtà sono astrazioni e quindi bisogna aprire la mente ma... ti agevolavano di molto il compito lasciandoti nell'ignoranza.
Allego quello che ho scritto fin'ora tanto per dare l'idea di quali sarebbero le mie intenzioni.
Il fil rouge è la programmazione BASC in Gambas e via via indicare alcune lezioni e/o discussioni per approfondire.
Viene perfetto come esempio quanto tu hai appena scritto sui puntatori e la lezione a cui rimandi che non può che essere chiara anche a uno alle prime armi.

Per tornare invece a bomba puoi spiegarmi il motivo ultimo (oltre al piacere di provare tutte le vie) per cui converrebbe utilizzare un puntatore rispetto al BASIC (se puoi lasciarmi passare la semplificazione)?


@Top Fuel
ciao e grazie,
inserendo questo codice suggerito da te e da vuott a me col la 3.6.0 funziona e ottengo lo stesso output del puntatore. Se hai provato con val() non appare nulla anche a me (era l'unica prova fatta in precedenza).
Codice: gambas [Seleziona]

     Dim c, s As String  
     Dim j, b As Byte        
    
      s = "gambas"        
    
      For j = 1 To String.Len(s)
        c = Mid$(s, j, 1)
        'b = CByte(Asc(c))  
        b = CByte(String.Code(c))
        Print Hex(b), b, c                  
      Next  
      c = Mid$(s, 4, 1)
      s = Replace$(s, c, Chr$(10))  
      Print s  

 :ciao:
« Ultima modifica: 31 Ottobre 2014, 18:02:24 da Gianluigi »
nuoto in attesa del bacio di una principessa che mi trasformi in un gambero azzurro

Offline vuott

  • Moderatore globale
  • Senatore Gambero
  • *****
  • Post: 11.317
  • Ne mors quidem nos iunget
    • Mostra profilo
Re: Dati aggregati
« Risposta #11 il: 31 Ottobre 2014, 16:37:32 »
Per tornare invece a bomba puoi spiegarmi il motivo ultimo (oltre al piacere di provare tutte le vie) per cui converrebbe utilizzare un puntatore rispetto al BASIC (se puoi lasciarmi passare la semplificazione)?


Se vai a vedere quello che ho aggiunto qui:
http://www.gambas-it.org/smf/index.php?topic=3762.msg34311#msg34311
capirai che avrei potuto ottenere il medesimo risultato più velocemente con le già belle e pronte funzioni della Classe Paint di Gambas. ...ed invece, no, mi sono andato ad impelagare negli ambiti della memoria :rolleyes: . Questo però mi ha aiutato ad affrontare e capire diverse questioni.

Gambas, come tutti i linguaggi di alto livello, ti presentano la pappa già pronta.
Il mio tentativo - come si può vedere dai miei numerosi argomenti inseriti nel forum - è basato su un approccio più che altro culturale. E' un atteggiamento culturale. Forse, come interesse, dovrei affrontare il C o meglio l'Assembly.

Ad ogni modo, ripeto, la necesità pratica dell'uso dei Puntatori in Gambas può - per lo più - sorgere se e quando si cominciano a gestire funzioni di librerie esterne che richiedono variabili di tipo Puntatore.
« Ultima modifica: 31 Ottobre 2014, 16:48:20 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.317
  • Ne mors quidem nos iunget
    • Mostra profilo
Re: Dati aggregati
« Risposta #12 il: 31 Ottobre 2014, 16:46:12 »
.... mi sono messo a scrivere un manualetto.
Ho visto.
Desidero che il mio nominativo non sia citato.

E' un lavoro meritorio e meritevole di lode.

« 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.158
  • Tonno verde
    • Mostra profilo
Re: Dati aggregati
« Risposta #13 il: 31 Ottobre 2014, 19:29:12 »
.... mi sono messo a scrivere un manualetto.
Ho visto.
Desidero che il mio nominativo non sia citato.

E' un lavoro meritorio e meritevole di lode.


Ciao vuott,
Ho provveduto, come richiesto, a togliere il tuo nome.
Io lo avevo messo perché trovo doveroso riconoscerti che quel che so di Gambas in buona parte è merito tuo, non solo tuo naturalmente ma tu hai contribuito direttamente e indirettamente in parte notevole.
Spero solo che questa tua richiesta non sia legata al contenuto scadente del manuale. :)
Spero inoltre che continuerai a supportarmi nello sforzo.
Invero non so se è fattibile inserirlo in Gambas-it.org se potrò e/o sarò capace a scriverlo come wiki ecc.
Comunque per ora lo scrivo in Writer e poi vedremo.
Rimane il fatto concreto che un supporto è oltremodo gradito.
 :ciao:
nuoto in attesa del bacio di una principessa che mi trasformi in un gambero azzurro

Offline Top Fuel

  • Gran Maestro dei Gamberi
  • *****
  • Post: 960
    • Mostra profilo
Re: Dati aggregati
« Risposta #14 il: 31 Ottobre 2014, 19:34:25 »
L'ho scaricato, lo leggerò e ti dirò cosa ne penso. :)
Dear youtube administrators, your search bar is broken. When I type the letter "J" it appears justin bieber when it should appear Jimi Hendrix. Fix this, please.