Autore Topic: array di strutture dati  (Letto 1381 volte)

Offline akrobaticone

  • Gran Maestro dei Gamberi
  • *****
  • Post: 983
    • Mostra profilo
array di strutture dati
« il: 09 Febbraio 2013, 00:35:19 »
tempo fa in una discussione è venuto fuori questo codice

Codice: [Seleziona]
Public Struct strutturaModello
   prB As Byte
   prI As Integer
End Struct


   Private prima As New StrutturaModello[]
 


Public Sub Form_Open()

Dim a As Byte

  Dim seconda As StrutturaModello


  For a = 0 To 9

     seconda = New StrutturaModello

    With seconda
     .prB = a
     .prI = 1000 + a
    End With

    prima.Add(seconda)

  Next

End


si definisce un array dinamico di una struttura e funziona bene

Il mio problema è che la definizione della struttura e dell'array



Codice: [Seleziona]
Public Struct strutturaModello
   prB As Byte
   prI As Integer
End Struct

   Private(public) prima As New StrutturaModello[]


le voglio mettere in in modulo, ma così facendo non funziona più

dove sbaglio?

ho provato a riferrirmi alla struttura con nomemodulo.StrutturaModello
ma nisba....
"e il naufragar m'è dolce in questo mar"

Offline vuott

  • Moderatore globale
  • Senatore Gambero
  • *****
  • Post: 11.723
  • Ne mors quidem nos iunget
    • Mostra profilo
Re: array di strutture dati
« Risposta #1 il: 09 Febbraio 2013, 00:47:40 »

Il mio problema è che la definizione della struttura e dell'array


le voglio mettere in in modulo, ma così facendo non funziona più

dove sbaglio?

ho provato a riferrirmi alla struttura con nomemodulo.StrutturaModello


Se non ho capito male, questa parte che ho scritto nella nostra WIKI dovrebbe fare al caso tuo:
http://www.gambas-it.org/wiki/index.php/Uso_delle_Strutture_tra_Classi_e_Moduli
(lì vedi: Passaggio di valori attraverso i parametri )
« Ultima modifica: 09 Febbraio 2013, 18:42:45 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 akrobaticone

  • Gran Maestro dei Gamberi
  • *****
  • Post: 983
    • Mostra profilo
Re: array di strutture dati
« Risposta #2 il: 09 Febbraio 2013, 01:07:24 »
vediamo se ho capito
in questo caso avviene un passaggio di una classe in un altra

quello che vorrei fare io è costruire  una struttura e creare un array dinamico con la stessa
questo in un modulo così da poterla vedere in tutti i form del progetto

Codice: [Seleziona]
' Gambas module file
Public Struct strutturaModello
   prB As Byte
   prI As Integer
End Struct

 Public prima As New StrutturaModello[]

inoltre vorrei aggiungere e togliere elementi a questo array dentro i form stessi

in un altro progetto avevo creato una classe ( e funzionava) , ma ora vorrei provare con  una struttura 

"e il naufragar m'è dolce in questo mar"

Offline vuott

  • Moderatore globale
  • Senatore Gambero
  • *****
  • Post: 11.723
  • Ne mors quidem nos iunget
    • Mostra profilo
Re: array di strutture dati
« Risposta #3 il: 09 Febbraio 2013, 01:17:45 »

in questo caso avviene un passaggio di una classe in un altra


Più precisamente avviene un passaggio dei valori, contenuti in una variabile di tipo Struttura, da una Classe ad un'altra.... ma con il Modulo è sostanzialmente uguale.

Ti passo, infatti, un semplicissimo esempio.

Nella Classe principale avremo questo codice:
Codice: gambas [Seleziona]

Public Module1 As New Module1 ' Istanziamo il Modulo


Public Struct strutturaModello
   prB As Byte
   prI As Integer
End Struct

' Dichiariamo la variabile della Struttura come array con numero di elementi indefinito:
  Private prima As New StrutturaModello[]


Public Sub Form_Open()

  Dim a As Byte

' Dichiariamo un'altra variabile del tipo della Struttura modello:
  Dim seconda As StrutturaModello

' Assegnamo i valori agli elementi della variabile normale di tipo Struttura:
  For a = 0 To 9

    seconda = New StrutturaModello

    With seconda
     .prB = a
     .prI = 1000 + a
    End With

' La variabile Struttura array vuole una variabile Struttura - non array - del tipo "StrutturaModello":
    prima.Add(seconda)

  Next
  
' Passiamo i valori contenuti dalla variabile array di tipo Struttura al Modulo:
  Module1.prova(prima)

End



Nel Modulo avremo:
Codice: gambas [Seleziona]

' Dichiariamo una "Struttura" avente medesimi campi della "Struttura"
' presente nella Classe principale, e medesimo nome.
' Anche i nomi degli elementi della Struttura saranno uguali
' a quelli della Struttura dichiarata nella Classe principale:
Public Struct strutturaModello
   prB As Byte
   prI As Integer
End Struct


' La routine, che viene richiamata dalla funzione chiamante presente nella Classe principale,
' riceve la variabile dalla Classe principale e l'assegna alla variabile di tipo "Struttura" del corrente Modulo:
Public Sub prova(var2 As StrutturaModello[])

  Dim j As Byte

  For j = 0 To 9
    
    With var2[j]
      Print .prB, .prI
    End With
  
  Next

End


Provalo un po'.



quello che vorrei fare io è costruire  una struttura e creare un array dinamico con la stessa
questo in un modulo così da poterla vedere in tutti i form del progetto

L'esempio, sopra esposto, funziona regolarmente anche se la Struttura principale è dichiarata ed istanziata all'interno di un Modulo_1, e se i valori contenuti dalla relativa variabile vengono passati ad una variabile, di quel analogo tipo di Struttura, dichiarata in un Modulo_2. Quindi, appunto, passaggio di valori fra due Moduli (e non più fra Classe principale e Modulo).
« Ultima modifica: 09 Febbraio 2013, 02:17:13 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 akrobaticone

  • Gran Maestro dei Gamberi
  • *****
  • Post: 983
    • Mostra profilo
Re: array di strutture dati
« Risposta #4 il: 09 Febbraio 2013, 11:58:10 »
ok
provato funziona

Domanda:
in un form secondario per vedere la struttura appena creata

devo scrivere
Codice: [Seleziona]
label1.text=ClassePrincipale.Prima[0].prB

naturalmente se ho dichiarato Prima Public

ma se dal form secondario volessi aggiungere un altro item all'array come devo fare?

in sostanza la mia struttura dati viene gestita in più form nei quali viene letta e aggiornata
Il progetto parte dal form principale, anche se sto pensando che potrebbe essere utile farlo partire dal Main()

Con una classe sarebbe più semplice?



"e il naufragar m'è dolce in questo mar"

Offline vuott

  • Moderatore globale
  • Senatore Gambero
  • *****
  • Post: 11.723
  • Ne mors quidem nos iunget
    • Mostra profilo
Re: array di strutture dati
« Risposta #5 il: 09 Febbraio 2013, 13:44:53 »
Domanda:
in un form secondario per vedere la struttura appena creata

devo scrivere
Codice: [Seleziona]
label1.text=ClassePrincipale.Prima[0].prB

naturalmente se ho dichiarato Prima Public


Attualmente, per poter agire con/sulle variabili di tipo derivato Struttura da una Classe o un Modulo diversi da quelli ove è stato istanziato puoi operare o con il classico passaggio di parametri, oppure dichiarando quella variabile come Pubblica (vedi al riguardo nella predetta pagina della WIKI sulle Strutture il pargrafo: Uso di una variabile Globale).
« Ultima modifica: 09 Febbraio 2013, 14:04:21 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 akrobaticone

  • Gran Maestro dei Gamberi
  • *****
  • Post: 983
    • Mostra profilo
Re: array di strutture dati
« Risposta #6 il: 09 Febbraio 2013, 14:01:19 »
Non so se può essre correto ma ho provato così

nel modulo Variabili
Codice: [Seleziona]
Public Struct Ricetta

   nome As String
  
End Struct

public struttura as new Ricetta
Public array As New Ricetta[]


nel form

Codice: [Seleziona]
' Gambas class file



Public Sub Form_Open()
dim a as object
a = variabili.struttura

a.nome = "Pippo"
Variabili.array.Add(a)

end

così riesco a vederlo in tutto il progetto
Non so però se è corretto dal punto di vista formale

ps
come si fa a postare il codice come sopra?

"e il naufragar m'è dolce in questo mar"

Offline fsurfing

  • Moderatore
  • Senatore Gambero
  • *****
  • Post: 2.482
    • Mostra profilo
Re: array di strutture dati
« Risposta #7 il: 09 Febbraio 2013, 14:50:41 »
a me sembra più comodo usare una classe...

che vantaggio cè ad usare una struttura in questo caso?



Offline vuott

  • Moderatore globale
  • Senatore Gambero
  • *****
  • Post: 11.723
  • Ne mors quidem nos iunget
    • Mostra profilo
Re: array di strutture dati
« Risposta #8 il: 09 Febbraio 2013, 15:02:41 »
Non so se può essre correto ma ho provato così


Non avevo mai fatto la prova al contrario: da un modulo alla classe principale. Il risultato dà esito negativo; suppongo perché il Modulo, appunto, non è una Classe con proprie proprietà ed elementi anche utilizzabili altrove, bensì esso ha il compito meramente di svolgere una o più funzioni gestendo dati ricevuti da altrove.

La cosa si può fare, se invece dichiari ed utilizzi una Classe secondaria anziché un Modulo.

Esempio:

Nella Classe principale va comunque dichiarata la Struttura in modo identico a quella dichiarata nella Classe secondaria:
Codice: gambas [Seleziona]

Public class1 As New Class1


Public Struct Ricetta

   nome As String
  
End Struct


Public ricettina As New Ricetta


Public Sub Form_Open()

   ricettina.nome = "prova"

' Ecco: chiamo ed utilizzo una variabile, di tipo Struttura,
' dichiarata ed istanziata nella Classe secondaria:
  class1.struttura.nome = " + prova"

  ricettina.nome &= class1.struttura.nome

' Ecco: chiamo ed utilizzo l'altra variabile, di tipo Struttura,
' dichiarata ed istanziata nella Classe secondaria:
   class1.array.Add(ricettina)
 
      Print Class1.array[0].nome

End



Nella Classe secondaria (al posto del Modulo):
Codice: gambas [Seleziona]

Public Struct Ricetta

   nome As String
    
End Struct

Public struttura As New Ricetta

Public array As New Ricetta[]
« Ultima modifica: 09 Febbraio 2013, 16:34:10 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.723
  • Ne mors quidem nos iunget
    • Mostra profilo
Re: array di strutture dati
« Risposta #9 il: 09 Febbraio 2013, 15:04:43 »
a me sembra più comodo usare una classe...

che vantaggio cè ad usare una struttura in questo caso?

Anche una Classe, nuda e pura, in effetti va benissimo (...l'ho usata in sostituzione della Struttura anche nei miei programmi MIDI !  ;D ) .  Tieni anche conto che lo stesso Minisini consiglia di utilizzare le Strutture soprattutto per raccogliere i dati di analoghe Strutture passate da funzioni esterne (dichiarate ovviamente con Extern).


Però, magari, esercitarsi un po' pure con le Strutture può far bene alla salute.......   ;D
« Ultima modifica: 09 Febbraio 2013, 16:37:28 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 Top Fuel

  • Gran Maestro dei Gamberi
  • *****
  • Post: 959
    • Mostra profilo
Re: array di strutture dati
« Risposta #10 il: 09 Febbraio 2013, 16:47:41 »
Nel vecchio QB con le variabili strutturate ci facevi di tutto, c'è stato qualcuno che usandole aveva trovato la maniera di suddividere un intero a 32 bit in 2 da 16 bit e viceversa senza fare nessun calcolo (non ero io, non preoccupatevi :) ).
« Ultima modifica: 09 Febbraio 2013, 16:51:46 da Top Fuel »
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.723
  • Ne mors quidem nos iunget
    • Mostra profilo
Re: array di strutture dati
« Risposta #11 il: 09 Febbraio 2013, 17:04:15 »
Nel vecchio QB con le variabili strutturate ci facevi di tutto,

In Gambas, oltre alle Strutture, hai in più anche le Classi da utilizzare similmente ad una Struttura.

Al riguardo vedi la pagina nella nostra WIKI:
http://www.gambas-it.org/wiki/index.php/Variabile_del_tipo_di_una_Classe_creata
« 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 akrobaticone

  • Gran Maestro dei Gamberi
  • *****
  • Post: 983
    • Mostra profilo
Re: array di strutture dati
« Risposta #12 il: 09 Febbraio 2013, 19:13:45 »
Avevo già utilizzato le classi nel mio programma Frequenze proprio perchè non erano disponibili le variabili strutturate
Visto che in Gambas 3 sono state implementate,  ho provato ad usarle  ma mi rendo conto che una classe crea meno problemi.
In fin dei conti una classe è una struttura con in più metodi ed eventi

Se i dati sono complessi e articolati vale la pena creare delle strutture interne alla classe
nel mio caso invece si limitano a 6/7 variabili e quindi le dichiaro direttamente come proprietà della classe stessa.

In ogni caso il codice che ho provato sembrava funzionare nel mio programma.......
"e il naufragar m'è dolce in questo mar"

Offline vuott

  • Moderatore globale
  • Senatore Gambero
  • *****
  • Post: 11.723
  • Ne mors quidem nos iunget
    • Mostra profilo
Re: array di strutture dati
« Risposta #13 il: 09 Febbraio 2013, 19:35:22 »
Io stesso ti ringrazio, comunque, per aver posto la questione, poiché ho avuto modo di approfondire l'argomento.  :ciao:
« 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. »