Comment initialiser un tableau dans une structure
Je suis en train d'initialiser un tableau et d'attribuer des valeurs, mais j'ai des problèmes de
Public Structure test1
<VBFixedArray(6)> Dim Id() As String
Public Sub initialize()
ReDim Id(6)
End Sub
End Structure
Dim myvalues() as test1
...
ReDim myvalues(10)
Je suis en train d'accomplir ceci avec l'exemple suivant
For i as short = 0 to 10
myvalues(i).Id(1) = "V"
myvalues(i).Id(2) = "H"
...
myvalues(i).Id(6) = "J"
next i
Ce n'est pas de travail bien et je ne suis pas sûr de la bonne mise en œuvre?
EDIT:
Imports Microsoft.VisualBasic
Module Module1
Structure test1
<VBFixedArray(6)> Dim Id() As String
Public Sub initialize()
ReDim Id(6)
For im As Integer = 0 To 6
Id(im) = ""
Next im
End Sub
End Structure
Sub Main()
Dim i As Integer
Dim myvalues() As test1
ReDim myvalues(10)
For Each oTest As test1 In myvalues
' Initialize the structure
ReDim myvalues(10)
oTest.initialize()
' Now loop through the array based on the bounds it was configured for
'initialize to empty string(NOT ABLE TO ASSIGN TO> myvalues(i).Id(j))
'I Get ERROR>>>Object reference not set to an instance of an object<<<<<
'For i = 0 To 10
For j As Integer = oTest.Id.GetLowerBound(0) To oTest.Id.GetUpperBound(0)
' Set the values in a case statement so that alterations to the size of the index won't break your code.
Select Case j
Case 0
oTest.Id(j) = "A"
myvalues(i).Id(j) = "A"
Case 1
oTest.Id(j) = "B"
'myvalues(i).Id(j) = "B"
Case 2
oTest.Id(j) = "C"
'myvalues(i).Id(j) = "C"
Case 3
oTest.Id(j) = "D"
'myvalues(i).Id(j) = "D"
Case 4
oTest.Id(j) = "E"
'myvalues(i).Id(j) = "E"
Case 5
oTest.Id(j) = "F"
'myvalues(i).Id(j) = "F"
Case 6
oTest.Id(j) = "G"
'myvalues(i).Id(j) = "G"
End Select
Next j
'Next i
Next 'oTest
'assign<<<<<<<<<<<<<<<<<<< NOT WORKING>>>>
'<<Id() is not set to <empty string> it is "Nothing" I GET ERROR (91) next line and after
'What am I doing wrong?
For i = 0 To 10
Console.WriteLine(myvalues(i).Id(0), myvalues(i).Id(1), myvalues(i).Id(2), myvalues(i).Id(3), myvalues(i).Id(4), myvalues(i).Id(5), myvalues(i).Id(6))
Next i
End Sub
End Module
- Wow! le célèbre
For-Case
modèle. Classique WTF - thedailywtf.com/articles/The_FOR-CASE_paradigm et thedailywtf.com/articles/Switched_on_Loops - Est-ce
VBA
code d'essayer de vivre au sein deVB.NET
? Il n'est pas nécessaire pourReDim
relevés, niSub initialize
. C'est ce que les tableaux dynamiques et les constructeurs sont pour.
Vous devez vous connecter pour publier un commentaire.
Le principal problème est que vous ne faites pas appel initialiser la structure. Vous devriez changer votre boucle à quelque chose comme:
Noter que les limites des structures de tableau sont utilisées pour contrôler la boucle dans le cas où les changements de taille. Cela signifie que vous n'aurez qu'à changer la taille du tableau en un seul endroit (la structure).
Noter également que les valeurs sont affectées dans une instruction case. Cela évite des erreurs d'exécution, si la matrice de dimensions changent. Tu risque d'avoir des erreurs de logique si vous n'avez pas réglé les valeurs de droite, mais ceux-ci peuvent être pris par un bon test de l'unité.
Des informations supplémentaires
Ma réponse initiale contenait une
For Each
déclaration que itérémyvalues
. Apparemment, cependant, ce n'est pas une opération contre un réseau de structures: l'élément que vous obtenez dans lesFor Each
variable n'est pas réellement mis à jour dans le tableau. Il semble être une référence différente.Je n'ai jamais travaillé avec des structures en VB.Net à moins que je les utilise pour effectuer des appels externes Dll, donc ce comportement m'a surpris. Sauf si vous devez absolument utiliser une structure, je conseille vivement de changer la mise en œuvre d'un
Class
.Ici est la mise en œuvre à l'aide d'une Classe:
Il y a une astuce pour ce faire
Je pense que c'est ce que vous voulez, même si elle n'est pas très clair dans le post: