Autore Topic: [RISOLTO] Tipo dati personalizzato  (Letto 2141 volte)

Offline vuott

  • Moderatore globale
  • Senatore Gambero
  • *****
  • Post: 11.724
  • Ne mors quidem nos iunget
    • Mostra profilo
[RISOLTO] Tipo dati personalizzato
« il: 30 Luglio 2010, 17:37:41 »
Quale istruzione/enunciato usare per creare un tipo dati personalizzato, o definito dall'utente; ossia un tipo di dati che l'utente definisce da sé ed utilizza poi come quelli predefiniti ?
« Ultima modifica: 17 Maggio 2012, 10:03:57 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 Ceskho

  • Amministratore
  • Senatore Gambero
  • *****
  • Post: 3.778
  • Vi Veri Veniversum Vivus Vici
    • Mostra profilo
    • Pagina Personale
Re: Tipo dati personalizzato
« Risposta #1 il: 30 Luglio 2010, 17:41:01 »
Quale istruzione/enunciato usare per creare un tipo dati personalizzato, o definito dall'utente; ossia un tipo di dati che l'utente definisce da sé ed utilizza poi come quelli predefiniti ?

Stai parlando di un typedef?o delle strutture?

Offline vuott

  • Moderatore globale
  • Senatore Gambero
  • *****
  • Post: 11.724
  • Ne mors quidem nos iunget
    • Mostra profilo
Re: Tipo dati personalizzato
« Risposta #2 il: 30 Luglio 2010, 18:05:57 »
Mi riferisco alle Strutture (o Record).
« 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 Ceskho

  • Amministratore
  • Senatore Gambero
  • *****
  • Post: 3.778
  • Vi Veri Veniversum Vivus Vici
    • Mostra profilo
    • Pagina Personale
Re: Tipo dati personalizzato
« Risposta #3 il: 30 Luglio 2010, 18:08:30 »
Mi riferisco alle Strutture (o Record).

Le strutture non esistono in Gambas2 ma sono state introdotte (o lo saranno) in Gambas3....in Gambas2 puoi ricorrere ai Moduli o alle Classi ma le strutture no!

Offline md9327

  • Moderatore
  • Senatore Gambero
  • *****
  • Post: 2.840
    • Mostra profilo
Re: [RISOLTO] Tipo dati personalizzato
« Risposta #4 il: 02 Agosto 2010, 10:29:39 »
Il che, a mio avviso, non ti cambia molto...

Puoi crearti delle classi con solo proprietà, senza metodi, e hai una struttura...

Offline vuott

  • Moderatore globale
  • Senatore Gambero
  • *****
  • Post: 11.724
  • Ne mors quidem nos iunget
    • Mostra profilo
Re: Tipo dati personalizzato
« Risposta #5 il: 31 Luglio 2011, 14:20:51 »
Le strutture non esistono in Gambas2 ma sono state introdotte (o lo saranno) in Gambas3....

Ecco, vorrei sapere se le Strutture sono state, quindi, introdotte ora in Gambas 3.
In caso positivo, come fare per gestirle ?

ah... solo oggi ho visto per Gambas 3 l'argomento " Dichiarazione di struttura ":

Codice: gambas [Seleziona]
PUBLIC STRUCT Identificatore

  Campo1 [ DichiaraArrayIncorporato ] AS [ TipoDato ]
  Campo2 [ DichiaraArrayIncorporato ] AS [ TipoDato ]
    .
    .
    .
  Campo n [ DichiaraArrayIncorporato ] AS [ TipoDato ]

END STRUCT



...va be' !
« Ultima modifica: 14 Maggio 2012, 16:57:05 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 md9327

  • Moderatore
  • Senatore Gambero
  • *****
  • Post: 2.840
    • Mostra profilo
Re: [RISOLTO] Tipo dati personalizzato
« Risposta #6 il: 09 Agosto 2011, 15:04:08 »
Dalle poche prove che ho fatto, sembrano comportarsi similarmente agli oggetti, tranne per il fatto che si presentano come template di una aggrezione di dati di tipo di verso (come del resto la structura è...).

Da quanto potuto appurare, la struttura deve essere definita all'interno di un modulo o classe, può contenere dati e array di diverso tipo, e può essere utilizzata, ovviamente, per creare array di strutture (ad es. PRIVATE $var AS STRUCT MyStruct[]).

La cosa può essere comoda, ma a mio parere è meglio utilizzare una classe ad-hoc, oltre al fatto che può essere riutilizzata in altre parti, instanziandola opportunamente. Mi pare di aver capito che la struct non può essere scambiata da più classi...

Comunque, come da esempio in documentazione, devi dechiararla così come descritto, definendo Private/Public la struttura, e non i singoli dati interni, e definendo i tipi di dati contenuti nella stessa.
L'utilizzo è uguale a quello di una comune classe, basta un semplice NEW per crearti la tua struttura e assegnarla ad una tua variabile.

Offline vuott

  • Moderatore globale
  • Senatore Gambero
  • *****
  • Post: 11.724
  • Ne mors quidem nos iunget
    • Mostra profilo
Re: [RISOLTO] Tipo dati personalizzato
« Risposta #7 il: 21 Agosto 2011, 17:09:45 »
Dalle poche prove che ho fatto, sembrano comportarsi similarmente agli oggetti, tranne per il fatto che si presentano come template di una aggrezione di dati di tipo di verso (come del resto la structura è...).
.........
L'utilizzo è uguale a quello di una comune classe, basta un semplice NEW per crearti la tua struttura e assegnarla ad una tua variabile.

Ho fatto una piccola prova:

Codice: gambas [Seleziona]
' Gambas-3 class file


PUBLIC Struct NomeStruttura      ' definisco i campi della Struttura "astratta"
  
' Questa Struttura si riserverà, occupandola, 9 byte di memoria in tutto:
  valore1 As Integer         ' dal byte n° 0 al n° 3
  valore2 As Integer         ' dal byte n° 4 al n° 7
  valore3 as Byte             ' il byte n° 8
  
END Struct

' creo una struttura "reale" composta a perfetta immagine di quella astratta;
' insomma una variabile del tipo della Struttura:
    Private nuovaStruttura As New NomeStruttura        


PUBLIC Sub valori_nuova_struttura()

 Dim  variabValor as Byte

  variabValor = inputbox("Immetto un valore per *riempire* il campo *variabile* di 'nuovaStruttura': valore3 .")

' attribuisco il valore a ciascun campo variabile della variabile-struttura
' (qui i valori sono due "costanti" ed uno "variabile")
  nuovaStruttura.valore1 = 3
  nuovaStruttura.valore2 = 6
  nuovaStruttura.valore3 = variabValor

END


PUBLIC Sub Button1_Click()

' quindi opero con i valori contenuti da "nuovaStruttura",
' ad esempio li faccio mostrare in console:
  With nuovaStruttura
    Print .valore1
    Print .valore2
    Print .valore3
  End With

END


Quando premo il tasto button1, nella console mi compaiono coerentemente i numeri 3, 6 ed il valore immesso con InputBox......... e va be'....
« Ultima modifica: 16 Luglio 2012, 01:47:16 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.724
  • Ne mors quidem nos iunget
    • Mostra profilo
Re: [RISOLTO] Tipo dati personalizzato
« Risposta #8 il: 15 Maggio 2012, 20:23:22 »
Dalle poche prove che ho fatto, sembrano comportarsi similarmente agli oggetti, tranne per il fatto che si presentano come template di una aggrezione di dati di tipo di verso (come del resto la structura è...).

Da quanto potuto appurare, la struttura deve essere definita all'interno di un modulo o classe, può contenere dati e array di diverso tipo, e può essere utilizzata, ovviamente, per creare array di strutture (ad es. PRIVATE $var AS STRUCT MyStruct[]).


Ho fatto quanche prova per tentare di creare array di Strutture.

1)
Innanzitutto sono riuscito a creare array di Strutture solo con questo tipo di dichiarazione della variabile-Struttura:
Private $var[100] As Struct MyStruct

2)
Poi, provando la riga da te proposta (PRIVATE $var AS STRUCT MyStruct[ ]), ho notato che non va bene, poiché vi è il ritorno di un errore:
Arrays of structure are not supported.

Viene però accettato così:
Private $var AS New MyStruct[]
...solo che in questo modo quando poi cerco successivamente di effettuare gli assegnamenti ai membri della Struttura, posso fare solo così:
 $var .Add( ...e mi compare l'etichetta d'aiuto: Value As MyStruct
..cioè dovrei inserire un'altra variabile-Struttura simile a $var.....   ???
« Ultima modifica: 15 Maggio 2012, 21:09: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 md9327

  • Moderatore
  • Senatore Gambero
  • *****
  • Post: 2.840
    • Mostra profilo
Re: [RISOLTO... ma c'è dell'altro] Tipo dati personalizzato
« Risposta #9 il: 16 Maggio 2012, 00:56:24 »
Non mi risulta ben chiaro cosa vuoi fare ma:

1) in effetti non puoi dichiarare una struttura come array
2) puoi definire array all'interno di una struttura
3) puoi dichiarare una tua variabile come un array di elementi di tipo "struttura", come hai tu fatto
4) puoi dichiarare solo strutture pubbliche, nel senso che messe in una classe, sono comunque visibili dall'esterno, quindi devi prevedere strutture sempre e comunque con nomi diversi

Non mi ricordo se l'ho scritto, ma dopo aver provato le strutture in gambas, molto diverse come logica e concetto ad esempio dal C/C++, sono ritornato alle classi, in quanto offrono una gestione più dinamica dei dati.
Tieni conto che le strutture sono nate fondamentalmente in C, quando ancora non non era neanche nata l'idea deglla programmazione ad oggetti, e quindi offrivano all'epoca uno strumento molto utile per risolvere determinati problemi. Io all'epoca li ho usati a mani piene, e poi anche integrati nella programmazione in C++ ad oggetti, ma poi piano piano sono andate scomparendo...

Offline vuott

  • Moderatore globale
  • Senatore Gambero
  • *****
  • Post: 11.724
  • Ne mors quidem nos iunget
    • Mostra profilo
Re: [RISOLTO... ma c'è dell'altro] Tipo dati personalizzato
« Risposta #10 il: 16 Maggio 2012, 01:33:16 »
Non mi risulta ben chiaro cosa vuoi fare
Solo un ragionamento teorico, diciamo accademico, per capire meglio.


1) in effetti non puoi dichiarare una struttura come array
2) ......
3) puoi dichiarare una tua variabile come un array di elementi di tipo "struttura", come hai tu fatto
Probabilmente mi sono espresso in modo non tecnico  :-X
Ad ogni modo lo scopo sostanziale era quello di avere, appunto,  tante Variabili array di tipo Struttura, che poi sono quelle concretamente utilizzabili. No ?  ;)


Ho fatto un altro esperimento cercando di risolvere la tua proposta di prima ( PRIVATE $var AS STRUCT MyStruct[] ):

Codice: gambas [Seleziona]

Public Struct strutturaModello
   prB As Byte
   prI As Integer
End Struct

' Dichiariamo la variabile della Struttura come array con numero di elementi indefinito.
' In questo caso sarà necessario inserire dopo "As" la parola "New" (e non Struct):
  Private prima As New StrutturaModello[]

' Dichiariamo un'altra variabile simile alla Struttura modello:
  Private seconda As New StrutturaModello


Public Sub Form_Open()

Dim a As Byte

  prima = New StrutturaModello[]

' Assegnamo i valori agli elementi della variabile 'non' array 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

End


' Andiamo a mostrare i risultati in console:
Public Sub Button1_Click()

 Dim a As Byte

 For a = 0 To 9
   With prima[a]
     Print .prB
     Print .prI
   End With
  Next

End
« Ultima modifica: 16 Maggio 2012, 12:36:42 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 md9327

  • Moderatore
  • Senatore Gambero
  • *****
  • Post: 2.840
    • Mostra profilo
Re: [RISOLTO... ma c'è dell'altro] Tipo dati personalizzato
« Risposta #11 il: 16 Maggio 2012, 10:55:20 »
A parte il motivo di creare due volte l'array (fuori metodo e entro metodo), l'esempio mi pare corretto.

Sul punto 2 del mio post:
Codice: [Seleziona]
Public Struct strutturaModello  
  prB As Byte [10]
  prI As Integer [10] 
End Struct 
diciamo un'altro modo per creare una struttura, anche se poco dinamico...

Offline vuott

  • Moderatore globale
  • Senatore Gambero
  • *****
  • Post: 11.724
  • Ne mors quidem nos iunget
    • Mostra profilo
Re: [RISOLTO... ma c'è dell'altro] Tipo dati personalizzato
« Risposta #12 il: 16 Maggio 2012, 12:26:06 »
A parte il motivo di creare due volte l'array (fuori metodo e entro metodo), l'esempio mi pare corretto.
In particolare a quale passaggio di quel codice ti riferisci ?  :-X


Sul punto 2 del mio post:
Codice: [Seleziona]
Public Struct strutturaModello  
  prB As Byte [10]
  prI As Integer [10] 
End Struct 
diciamo un'altro modo per creare una struttura,
Certamente, anche se qui ovviamente ad essere array sono i membri della Struttura, e non una variabile connessa di tipo Struttura.
« Ultima modifica: 16 Maggio 2012, 12:30:50 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 md9327

  • Moderatore
  • Senatore Gambero
  • *****
  • Post: 2.840
    • Mostra profilo
Re: [RISOLTO... ma c'è dell'altro] Tipo dati personalizzato
« Risposta #13 il: 16 Maggio 2012, 15:08:07 »
Mi riferisco al fatto che nella dichiarazione esterna viene usato il NEW, come anche la RIdichiarazione interna alla funzione (sempre NEW).

Non che provochi qualcosa di anomalo, solo che si tenta di allocare due volte la stessa variabile inutilmente.

Di solito le strade sono due:

1) nella dichiarazione di proprietà di una classe, viene effettuata anche la sua inizializzazione
2) l'inizializzazione viene fatta dal metodo creatore della classe _new()

Offline vuott

  • Moderatore globale
  • Senatore Gambero
  • *****
  • Post: 11.724
  • Ne mors quidem nos iunget
    • Mostra profilo
Re: [RISOLTO... ma c'è dell'altro] Tipo dati personalizzato
« Risposta #14 il: 16 Maggio 2012, 15:59:17 »
Mi riferisco al fatto che nella dichiarazione esterna viene usato il NEW, come anche la RIdichiarazione interna alla funzione (sempre NEW).

Non che provochi qualcosa di anomalo, solo che si tenta di allocare due volte la stessa variabile inutilmente.

Di solito le strade sono due:

1) nella dichiarazione di proprietà di una classe, viene effettuata anche la sua inizializzazione
2) l'inizializzazione viene fatta dal metodo creatore della classe _new()

Ummm...quanto rilevi e quanto suggerisci è molto utile, grazie.
Volendo seguire la prima soluzione correttiva, è coerente questa modifica che appresso riporto ?

Codice: gambas [Seleziona]

Public Struct strutturaModello
   prB As Byte
   prI As Integer
End Struct

   Private prima As StrutturaModello[] = 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


' Andiamo a mostrare i risultati in console:
Public Sub Button1_Click()

 Dim a As Byte

 For a = 0 To 9
   With prima[a]
     Print .prB
     Print .prI
   End With
  Next

End


Facendo la prova pratica, il codice funziona.
« Ultima modifica: 16 Maggio 2012, 16:03:16 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. »