Oppure

Loading
04/08/10 1:07
nostradamus1915
Ok, sono riuscito a ridimensionare le matrici con le seguenti istruzioni:

ReDim Preserve vmpb(2, 8)
ReDim Preserve vmpn(2, 8)

Però quando vado a lavorare sull'array mi da sempre l'eccezione "Object reference not set to an instance of an object.". Any solutions? Please :d
aaa
04/08/10 5:58
mattia1481
Primo :
io uso VB.NET 2005...ma dubito che nella versione 2008 non funzioni System.Array.Resize

Secondo :
Con le istruzioni che ti ho scritto non hai fatto altro che inizializzare un array di puntatori "vmpb" nulli (Nothing), ora sta a te passare ad ognuno di questi puntatori una istanza della classe "vmpb".

Mi permetto di consigliarti la lettura/studio di qualche testo in materia prima di iniziare a sviluppare qualche programma, giusto per avere qualche concetto di base con cui lavorare.
aaa
04/08/10 8:44
Il Totem
Postato originariamente da nostradamus1915:

Ciao a tutti, sto provando a creare un array di oggetti in VB 2008. Vi spiego come ho fatto:

1. Ho creato una nuova classe di nome pezzo
Public Class pezzo
Public x, y, tipo As Integer
Public alive As Boolean
Public move(8, 8) As Boolean
Public colour As Char
End Class

2. Ho dichiarato le variabili globali all'interno del modulo
Module mod
Public vmpb(2, 8) As pezzo
Public vmpn(2, 8) As pezzo
Public scacc As scacchiera
End Module

3. Infine ho eseguito le diverse operazioni di assegnazione nel form
Dim i, k As Integer
For i = 1 To 2
For k = 1 To 8
vmpb(i, k).alive = True
vmpn(i, k).alive = True
vmpb(i, k).colour = "b"
vmpn(i, k).colour = "n"
vmpb(i, k).x = i
vmpb(i, k).y = k
vmpn(i, k).x = i + 7
vmpn(i, k).y = k
Next
Next

Il problema si verifica quando eseguo il programma. Infatti mi viene richiesto di inserire new affianco alla dichiarazione dell'oggetto, quindi Public vmpb(2, 8) As NEW pezzo, ma, quando vado ad apportare la modifica, mi dice che per un array non può essere usata l'istruzione new. Come posso fare? Spero possiate aiutarmi, grazie.


Cercherò di riassumere tutto in alcuni punti:

1. Non è possibile inizializzare array o matrici nella dichiarazione di classi e/o strutture. Nella fattispecie, non puoi specificare gli indici. Devi inizializzare l'array manualmente prima dell'uso.

2. Per ridimensionare un array si possono usare alcuni metodi: Array.Resize, ReDim e ReDim Preserve. L'ultimo è inutile in questo caso, poiché serve a preservare dati esistenti, ma prima dell'uso non esiste alcun dato. Scrivendo:
ReDim vmpb(2, 8)

Inizializzi la matrice con 3 righe e 9 colonne. Questa sintassi non vale per gli array di array.

3. Se conoscessi le classi, sapresti che ogni variabile di tipo reference (oggetto) deve essere inizializzata. Come ha detto mattia, ora hai solo una matrice piena di valori nulli (Nothing), ad ognuno di essi devi assegnare un nuovo oggetto:
For I As Byte = 0 To 2
   For J As Byte = 0 To 8
     vmpb(I, J) = New pezzo()
   Next
Next


4. Nel tuo caso è inutile usare classi, perchè sprechi solo codice (come ti ho mostrato al punto sopra). Usa invece una struttura, che non ha bisogno di inizializzazione.
aaa
04/08/10 15:54
nostradamus1915
Ooooook funziona thanks :)
aaa