Sono ancora qua.
Premetto: sto cercando di portare un programma VB in Gambas e l'operazione procede a fasi alterne: difficoltà. studio, risolvo velocemente, altri problemi, studio, e a forza di tentativi trovo una soluzione, e così via.
Questa volta però, dopo essere impazzito con vari help e spiegazioni multi-linguistiche, mi trovo più in braghe di tela di prima, quindi chiedo aiuto.
Esigenza:
devo creare degli Array di strutture publiche, sulle quali andare ad agire con dei metodi pubblici (es. aggiungi, elimina, ordina, stampa,..)
Le strutture e i metodi sono contenuti in un modulo per mie questioni di ordine del codice.
Nel form Main devo dichiarare e instanziare delle variabili delle mie strutture per passarle poi come argomenti alle funzioni del modulo.
Alltro punto fondamentale è che gli array di strutture devono essere dinamici per poter aggiungere o eliminare dei record.
2 (grandi) problemi:
1. nel form Main non riesco a dichiarare delle istanze delle strutture
2. non so (ed ottengo errori provando) come ridimensionare l'array con i metodi Resize e Delete.
Riporto di seguito il codice minimale che sto usando per le prove - i commenti sulle righe sono gli errori che ottengo):
Modulo con dichiarazioni e metodi
' Gambas module file
Public Struct myLista
nome As String
tel As Integer
End Struct
Private elenco[10] As Struct MyLista
Public Sub Riempi()
Dim i As Integer
Dim vv As Integer
For i = 0 To 9
vv = 100 * i
elenco[i].tel = vv
elenco[i].nome = CStr(vv)
Next
Return
End
Public Function GetItem(itm As Integer) As MyLista
Return elenco[itm]
End
Public Function Espandi(n As Integer) As Boolean
elenco.resize(n) 'unknown symbol 'resize' in class $MyLista[]
Return elenco.Count
End
Form Main che richiama il modulo:
Public Sub Form_Open()
'alternative provate
Dim itm As MyLista 'Unknown identifier MyLista
Dim itm As Struct MyLista 'Unexpected Struct
Dim itm As ModTest.MyLista 'Unexpected '.'
Dim itm As Struct ModTest.MyLista 'Unexpected Struct
modTest.Riempi
Label1.Caption = modTest.GetItem(5).nome
Print modTest.Espandi(3)
End
Una birra pagata a chi mi dà una dritta :2birre:
Scusa ma io di queste robe ne capisco poco però così a prima vista noto che sei in un modulo e non in una classe...
:ciao:
Ciao, vedo che sei sempre attivo, H24 !
Si in effetti è un modulo, però per quanto riguarda l'argomento questo non dovrebbe influire; non mi serve instanziare il contenuto e il modulo è più leggero, almeno credo.
Aggiornamento:
ho appena provato (le sto provando tutte) a modificare la dichiarazione dell'Array di strutture e ho beccato un altro schiaffo che dice: "Array di strutture non supportato"...aiuto, sempre più confuso.
Qual'è la differenza tra queste 2 dichiarazioni:
Private elenchi[10] As Struct MyElenco
Private elenchi As Struct MyElenco[](10)
??????
Qual'è la differenza tra queste 2 dichiarazioni:
Private elenchi[10] As Struct MyElenco
Private elenchi As Struct MyElenco[](10)
Nella seconda dichiarazione stai usando parentesi tonde, non sono ammesse.
La prima dichiarazione è un normale array statico di 10 elementi, la seconda è una matrice di matrici, come spiegato nell'help, in pratica se non mi sbaglio 10 matrici dinamiche tutte assieme.
Riguardo i metodi Resize e Delete, non possono essere usati su array statici, solo sui dinamici.
Grazie a te e all'onnipresente Vuott per le risposte.
Dopo ore rubate al sonno inizio ad intravvedere la luce di San Midi.
Una nota sull'uso delle parentesi tonde; l'esempio l'ho preso dal sito Gambas-user che riporta in un post (PlanStructure è una struttura articolata):
You can give an initial size (as shown above) with
Plan = New PlanStructure[](iInitialSize)
Venendo a me, l'esigenza è di avere matrici DINAMICHE di strutture per poter aggiungere e togliere elementi.
La dichiarazione: Private elenchi[10] As Struct MyElenco
funziona, ma è statica, quindi niente .ADD/.REMOVE
La dichiarazione: Public elenco As New Struct MyLista[]
dovrebbe essere dinamica, ma da errore (curioso!, visto il seguito) di "Arrays of structure are not supported"
L'inghippo sta nella sintassi della dichiarazione; il termine 'Struct' non piace.
La dichiarazione corretta è con il solo termine New: Public elenco As New MyLista[]
Così creo un array vuoto di strutture MyLista, che andrò poi a riempire aggiungendo gli elementi in questo modo:
ele = New MyLista
ele.nome = qualcosa
ele.numero = altro numero
elenco.Add(ele)
Tutto OK :D
Basta una parola in più o una in meno per sbatterci la testa.
Questo è stato provando inserendo tutto il codice, comprese dichiarazioni, all'interno della class Main; ora devo provare a portare fuori il tutto in un Modulo (cosa che prima mi incasinava ancora di più) e verificare che sia ancora ok.
Ho voluto riassumere e riportare qui i miei risultati, sicuramente banali per voi e per tanti, per chi come me è alle prime armi con il Gamberetto, bello ma terribilmente confuso per gli ex VBisti.
Grazie
Una nota sull'uso delle parentesi tonde; l'esempio l'ho preso dal sito Gambas-user che riporta in un post (PlanStructure è una struttura articolata):
You can give an initial size (as shown above) with
Plan = New PlanStructure[](iInitialSize)
La tua annotazione è del tutto conferente. Infatti è possibile attualmente determinare il numero degli elementi di un vettore in entrambi i modi:
Dim a As New Byte[10]
Dim b As New Byte[](10)
Venendo a me, ...... per chi come me è alle prime armi con il Gamberetto, bello ma terribilmente confuso per gli ex VBisti.
Ho visto ciò che scrivi e la terminologia che usi, nonché le questioni che poni. Mi sembra che tu sia ben preparato nella teoria: quando prenderai - fra un po' - dimistichezza con il linguaggio Gambas, diventerai un bravo Programmatore Gambas.
Ho... come la sensazione che San Midi sia al tuo fianco e ti protegga...
Ho una situazione che non so come risolvere.
Sto scrivendo un progettino dove viene usato un vettore di strutture:
Public Struct PuntoBezier
x As Float
y As Float
End Struct
Private punti As New PuntoBezier[]
Poi questo vettore viene riempito con 5 elementi:
Public Sub _new()
'un esempio con 5 punti di controllo
Dim punto As PuntoBezier
punto = New PuntoBezier
punto.x = 20
punto.y = 30
punti.Add(punto)
punto.x = 90
punto.y = 110
punti.Add(punto)
punto.x = 200
punto.y = 300
punti.Add(punto)
punto.x = 550
punto.y = 600
punti.Add(punto)
punto.x = 800
punto.y = 300
punti.Add(punto)
End
Il guaio è che tutti e 5 gli elementi hanno il valore dell'ultimo aggiunto, cioè 800 e 300. Sbaglio qualcosa? :-\
Il guaio è che tutti e 5 gli elementi hanno il valore dell'ultimo aggiunto, cioè 800 e 300. Sbaglio qualcosa? :-\
Sì: devi riconfermare la riga
ogni volta, così come segue:
Dim punto As PuntoBezier
punto = New PuntoBezier
punto.x = 20
punto.y = 30
punti.Add(punto)
punto = New PuntoBezier
punto.x = 90
punto.y = 110
punti.Add(punto)
punto = New PuntoBezier
punto.x = 200
punto.y = 300
punti.Add(punto)
punto = New PuntoBezier
punto.x = 550
punto.y = 600
punti.Add(punto)
punto = New PuntoBezier
punto.x = 800
punto.y = 300
punti.Add(punto)
End
Vedi:
http://www.gambas-it.org/wiki/index.php?title=Strutture:_dichiarazione_ed_uso#Vettori_con_numero_di_elementi_indefinito