[VB.NET] Probleme Tableau structure

Bonjour
Voila j'ai un probleme avec un tableau a une dimension structuré

1. Public Structure mouvement
2. <VBFixedString(10)> Dim datemv As String
3. <VBFixedString(10)> Dim libellé As String
4. <VBFixedString(50)> Dim débit As String
5. <VBFixedString(10)> Dim crédit As String
6. End Structure
7. Dim n As Integer = 0
8. Dim tabmouv() As mouvement
9. tabmouv(n).datemv = "0"
10. tabmouv(n).libellé = "0"
11. tabmouv(n).débit = "0"
12. tabmouv(n).crédit = "0"

J'ai un avertissement sur la ligne souligné
"Avertissement 2 La variable 'tabmouv' est utilisée avant qu'une valeur ne lui ait été assignée. Une exception de référence null peut se produire au moment de l'exécution."
J'ai l'erreur suivante sur la ligne soulignée lorsque j'execute
"System.NullReferenceException : La référence d'objet n'est pas définie à une instance d'un objet."

merci de votre aide
Configuration: Windows XP
Firefox 2.0.0.13
Visual Studio 2005 Pro

4 réponses

  1. en faisant cela : Dim tabmouv() As mouvement
    tu as declaré un pointeur (c'est a dire sans dimension)
    tu dois declarer ton tableau avec une dimension finie : Dim tabmouv(2) As mouvement
    du coup tabmouv(0) sera connu
    1. merci de ta réponse

      Le probleme c'est que je ne sais pas combien d'élément je vais mettre dans mon tableau
      Je vais parcourrir une base de donnée et ajouter dans le tableau tout les mouvements

      Il faudrait que je compte le nombre de mouvement dans ma base de donnée puis ensuite je fait
      dim tabmouv(nbmouv) as mouvement ?
      1. ce serait une solution.
        La deuxieme serait de faire de l'allocation dynamique pour ton tableau. Mais je ne me souviens plus des commandes. Il faudrait que tu regardes dans l'aide de VB du coté de New() je pense.
    2. merci
      oui j'ai vu dans l'aide il parle de new mais j'ai pas tout compris

      Là avec la premiere solution ça irai mais pour la requete j'ai un petit souci
      select count(numéro) from mouvements
      mouvements est une table, numéro est un champ de mouvements
      Normalement j'ai un entier en sortie de cette requete ?
      J'ai fait :
      Dim monAccesBD = New gestionBD("127.0.0.1", "baseig", "root", "root")
      Dim nbmv As Integer = monAccesBD.MySQL_Select("select count(numéro) from mouvements")
      Dim tabmouv(nbmv) As mouvement
      mais il me dit que nbmv doit être de type odbc.odbcdataReader
      1. dans ce cas la, tu pourrais utilliser les fonction Redim

        Public Structure mouvement
        <VBFixedString(10)> Dim datemv As String
        <VBFixedString(10)> Dim libellé As String
        <VBFixedString(50)> Dim débit As String
        <VBFixedString(10)> Dim crédit As String
        End Structure

        Dim tabmouv() As mouvement

        Sub Main()

        ReDim tabmouv(2)

        tabmouv(0).datemv = "0"
        tabmouv(0).libellé = "0"
        tabmouv(0).débit = "0"
        tabmouv(0).crédit = "0"
        ...

        et tu fais ton redim dans ta boucle de lecture
    3. ok merci mais finallement je fait avec une collection : generic.list
      ça fonctionne maintenant je tri cette liste par date croissante
      listmouv est la liste deja rempli :
      Dim permut As Boolean = True
      Dim tabdate1() As String
      Dim tabdate2() As String
      Dim stock As mouvement
      Dim j As Integer
      Do While permut = True
      permut = False
      For j = 1 To listmouv.Count - 1
      tabdate1 = Split(listmouv.Item(j - 1).datemv, "/", 3)
      tabdate2 = Split(listmouv.Item(j).datemv, "/", 3)
      If Val(tabdate1(2)) > Val(tabdate2(2)) Then
      permut = True
      Else
      If Val(tabdate1(2)) = Val(tabdate2(2)) And Val(tabdate1(1)) > Val(tabdate2(1)) Then
      permut = True
      Else
      If Val(tabdate1(2)) = Val(tabdate2(2)) And Val(tabdate1(1)) = Val(tabdate2(1)) And Val(tabdate1(0)) >= Val(tabdate2(0)) Then
      permut = True
      End If
      End If
      End If
      If permut = True Then
      stock = listmouv.Item(j - 1)
      listmouv.Item(j - 1) = listmouv.Item(j)
      listmouv.Item(j) = stock
      End If
      Next
      Loop