Meilleur auteur de réponses
Où sont les erreurs ???????

Question
-
Aidez moi s'il vous plait, j'ai fait 2 jours entrain de chercher les erreurs logiques et de compilations au niveau de la procedure ci dessous. La procedure permet seulement de faire entrer des valeurs dans une structure sommet lorsque l'utilisateur clique sur le bouton OK. Voici ma logique: j'ai creé une structure nommée sommet, en voici sa definition: Structure Sommet Dim nom As String Dim nbrePred As Integer Dim valEtiq As Integer Dim etiq As Integer Dim tabPred() As String Dim tabPond() As Integer End Structure j'ai crée ensuite un tableau de cette structure: Dim tabSommet() As Sommet j'ai declaré une variable qui va lire la longeur de ce tableau de structure sommet: Dim nbreSommet as integer j'ai declarée deux variables pour parcourir le tableau de structure et les deux tableaux tabPred et tabPond: Dim compteur as integer Dim i as integer Les voici mes codes: Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click Dim i As Integer Dim compteur as integer Dim tabSommet() As Sommet Dim nbreSommet as integer If nbreSommet = 0 Then nbreSommet = TextBox1.Text ReDim tabSommet(nbreSommet - 1) compteur = 0 End If tabSommet(compteur).nom = TextBox2.Text tabSommet(compteur).nbrePred = TextBox3.Text tabSommet(compteur).valEtiq = 0 tabSommet(compteur).etiq = compteur + 1 For i = 0 To TextBox3.Text - 1 tabSommet(compteur) = New Sommet tabSommet(compteur).tabPred(i) = InputBox("Introduire les Predecesseurs") tabSommet(compteur).tabPond(i) = InputBox("Introduire les ponderations") Next i compteur = compteur + 1 TextBox2.Text = vbNullString TextBox3.Text = vbNullString TextBox2.Focus() compteur = compteur + 1 End sub Mais lorsque je l'execute, ce message apparait: "La référence d'objet n'est pas définie à une instance d'un objet." Comment faire ? Merci d'avance pour votre aide.
migration de vb.net à vb 2005
Réponses
-
Bonjour,
Le problème vient du fait que tes tableaux à l'interieur de ta structure ne sont pas initialisés.
Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click Dim i As Integer Dim compteur As Integer Dim tabSommet(1) As Sommet Dim nbreSommet As Integer = 0 If nbreSommet = 0 Then nbreSommet = TextBox1.Text ReDim tabSommet(nbreSommet - 1) compteur = 0 End If tabSommet(compteur).nom = TextBox2.Text tabSommet(compteur).nbrePred = TextBox3.Text tabSommet(compteur).valEtiq = 0 tabSommet(compteur).etiq = compteur + 1 For i = 0 To TextBox3.Text - 1 tabSommet(compteur) = New Sommet ReDim tabSommet(compteur).tabPred(TextBox3.Text - 1) ReDim tabSommet(compteur).tabPond(TextBox3.Text - 1) tabSommet(compteur).tabPred(i) = InputBox("Introduire les Predecesseurs") tabSommet(compteur).tabPond(i) = InputBox("Introduire les ponderations") Next i compteur = compteur + 1 TextBox2.Text = vbNullString TextBox3.Text = vbNullString TextBox2.Focus() compteur = compteur + 1 End Sub
Mais je pense que tu devrais adopter une approche plus objet.
Premierement, il te faudrais un objet (une classe) à la place de ta structure.
Ensuite il te faudrais des collections ou des listes à la place de tes tableaux.
Ces deux principes te permettrait de ne pas avoir à te soucier de l'initialisation de tes tableaux.- Proposé comme réponse jchtible lundi 10 août 2009 15:53
- Marqué comme réponse Marius Bugiulescu lundi 17 août 2009 11:48
-
Bonjour
Je suis entierement dacord avec jchtible.
Je te anoté plusieres problémés dans ton code;
Structure Sommet Friend nom As String Friend nbrePred As Integer Friend valEtiq As Integer Friend etiq As Integer Friend tabPred() As String 'Declarer comme Liste of T 'Friend tabPred As List(Of String) Friend tabPond() As Integer 'Friend tabPont As List(Of Integer) End Structure Dim tabSommet() As Sommet Dim nbreSommet As Integer Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click Dim i As Integer Dim compteur As Integer Dim tabSommet() As Sommet Dim nbreSommet As Integer If nbreSommet = 0 Then nbreSommet = TextBox1.Text ReDim tabSommet(nbreSommet - 1) compteur = 0 End If tabSommet(compteur).nom = TextBox2.Text 'PEUT ETRE SOURCE DE PROBLEMES PLUS TARD (La variable 'tabSommet est utilisée avant qu'une valeur ne lui ait été assignée) tabSommet(compteur).nbrePred = TextBox3.Text tabSommet(compteur).valEtiq = 0 tabSommet(compteur).etiq = compteur + 1 For i = 0 To TextBox3.Text - 1 tabSommet(compteur) = New Sommet 'Pourqoi al interieur de for-next??? '!!!! Tu te adresses a des ARRAYS Non dimensionés. Il Faut dimensioné un Array avant son utilisation !!!! ReDim Preserve tabSommet(compteur).tabPred(i) ReDim Preserve tabSommet(compteur).tabPond(i) tabSommet(compteur).tabPred(i) = InputBox("Introduire les Predecesseurs") 'Si on click sur annuler sans dans l'inputbox le string returné est vide. 'Un string vide, egal comme un string qui ne contient pas de chiffres, peut pas étre convertie en integer 'Tester sie la entrée est valide Dim Test As Integer Try Test = CInt(InputBox("Introduire les ponderations")) tabSommet(compteur).tabPond(i) = Test Catch MsgBox("Entrées un valeur nummerique dans 'Introduire les ponderations'") End Try Next i compteur = compteur + 1 TextBox2.Text = vbNullString TextBox3.Text = vbNullString TextBox2.Focus() compteur = compteur + 1 End Sub
Cordialement heka2
ps* Desolé pour le retard- Marqué comme réponse Marius Bugiulescu lundi 17 août 2009 11:48
Toutes les réponses
-
Bonjour! charry.nk
S.V.P. entre le code en copiant Copie/Coller en utilisant le bouton inserer Block de code. C'est l'icon enhaut tout a droit dans l'editeur de message. Cela nous permet de copier ton code directement dans une solution vierge de visualstudio. C'est plus facil a voir et a reproduir le erreur et on saurà dans quelle ligne le erreur se produit et a quelle reference l'erreur est attaché.
Cordialement heka 2
PS. Je ne serai pas chez moi avant 18 ou 19 heure aujourdui. -
Bonjours
La procedure permet seulement de faire entrer des valeurs dans une structure
sommet lorsque
l'utilisateur clique sur le bouton OK.
Voici ma logique:
j'ai creé une structure nommée sommet, en voici sa definition:
Structure Sommet
Dim nom As String
Dim nbrePred As Integer
Dim valEtiq As Integer
Dim etiq As Integer
Dim tabPred() As String
Dim tabPond() As Integer
End Structure
j'ai crée ensuite un tableau de cette structure:
Dim tabSommet() As Sommet
j'ai declaré une variable qui va lire la longeur de ce tableau de structure
sommet:
Dim nbreSommet as integer
j'ai declarée deux variables pour parcourir le tableau de structure et les
deux tableaux tabPred et tabPond:
Dim compteur as integer
Dim i as integer
Private Sub Button1_Click(...) Handles Button1.Click Dim i As Integer Dim compteur as integer Dim tabSommet() As Sommet Dim nbreSommet as integer If nbreSommet = 0 Then nbreSommet = TextBox1.Text ReDim tabSommet(nbreSommet - 1) compteur = 0 End If tabSommet(compteur).nom = TextBox2.Text tabSommet(compteur).nbrePred = TextBox3.Text tabSommet(compteur).valEtiq = 0 tabSommet(compteur).etiq = compteur + 1 For i = 0 To TextBox3.Text - 1 tabSommet(compteur) = New Sommet tabSommet(compteur).tabPred(i) = InputBox("Introduire les Predecesseurs") tabSommet(compteur).tabPond(i) = InputBox("Introduire les ponderations") Next i compteur = compteur + 1 TextBox2.Text = vbNullString TextBox3.Text = vbNullString TextBox2.Focus() compteur = compteur + 1 End sub
Mais lorsque je l'execute, ce message apparait: "La référence d'objet n'est pas définie à une instance d'un objet."
Comment faire ?
Merci d'avance pour votre aide.
migration de vb.net à vb 2005- Proposé comme réponse jchtible lundi 10 août 2009 15:53
-
Bonjour,
Le problème vient du fait que tes tableaux à l'interieur de ta structure ne sont pas initialisés.
Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click Dim i As Integer Dim compteur As Integer Dim tabSommet(1) As Sommet Dim nbreSommet As Integer = 0 If nbreSommet = 0 Then nbreSommet = TextBox1.Text ReDim tabSommet(nbreSommet - 1) compteur = 0 End If tabSommet(compteur).nom = TextBox2.Text tabSommet(compteur).nbrePred = TextBox3.Text tabSommet(compteur).valEtiq = 0 tabSommet(compteur).etiq = compteur + 1 For i = 0 To TextBox3.Text - 1 tabSommet(compteur) = New Sommet ReDim tabSommet(compteur).tabPred(TextBox3.Text - 1) ReDim tabSommet(compteur).tabPond(TextBox3.Text - 1) tabSommet(compteur).tabPred(i) = InputBox("Introduire les Predecesseurs") tabSommet(compteur).tabPond(i) = InputBox("Introduire les ponderations") Next i compteur = compteur + 1 TextBox2.Text = vbNullString TextBox3.Text = vbNullString TextBox2.Focus() compteur = compteur + 1 End Sub
Mais je pense que tu devrais adopter une approche plus objet.
Premierement, il te faudrais un objet (une classe) à la place de ta structure.
Ensuite il te faudrais des collections ou des listes à la place de tes tableaux.
Ces deux principes te permettrait de ne pas avoir à te soucier de l'initialisation de tes tableaux.- Proposé comme réponse jchtible lundi 10 août 2009 15:53
- Marqué comme réponse Marius Bugiulescu lundi 17 août 2009 11:48
-
Bonjour
Je suis entierement dacord avec jchtible.
Je te anoté plusieres problémés dans ton code;
Structure Sommet Friend nom As String Friend nbrePred As Integer Friend valEtiq As Integer Friend etiq As Integer Friend tabPred() As String 'Declarer comme Liste of T 'Friend tabPred As List(Of String) Friend tabPond() As Integer 'Friend tabPont As List(Of Integer) End Structure Dim tabSommet() As Sommet Dim nbreSommet As Integer Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click Dim i As Integer Dim compteur As Integer Dim tabSommet() As Sommet Dim nbreSommet As Integer If nbreSommet = 0 Then nbreSommet = TextBox1.Text ReDim tabSommet(nbreSommet - 1) compteur = 0 End If tabSommet(compteur).nom = TextBox2.Text 'PEUT ETRE SOURCE DE PROBLEMES PLUS TARD (La variable 'tabSommet est utilisée avant qu'une valeur ne lui ait été assignée) tabSommet(compteur).nbrePred = TextBox3.Text tabSommet(compteur).valEtiq = 0 tabSommet(compteur).etiq = compteur + 1 For i = 0 To TextBox3.Text - 1 tabSommet(compteur) = New Sommet 'Pourqoi al interieur de for-next??? '!!!! Tu te adresses a des ARRAYS Non dimensionés. Il Faut dimensioné un Array avant son utilisation !!!! ReDim Preserve tabSommet(compteur).tabPred(i) ReDim Preserve tabSommet(compteur).tabPond(i) tabSommet(compteur).tabPred(i) = InputBox("Introduire les Predecesseurs") 'Si on click sur annuler sans dans l'inputbox le string returné est vide. 'Un string vide, egal comme un string qui ne contient pas de chiffres, peut pas étre convertie en integer 'Tester sie la entrée est valide Dim Test As Integer Try Test = CInt(InputBox("Introduire les ponderations")) tabSommet(compteur).tabPond(i) = Test Catch MsgBox("Entrées un valeur nummerique dans 'Introduire les ponderations'") End Try Next i compteur = compteur + 1 TextBox2.Text = vbNullString TextBox3.Text = vbNullString TextBox2.Focus() compteur = compteur + 1 End Sub
Cordialement heka2
ps* Desolé pour le retard- Marqué comme réponse Marius Bugiulescu lundi 17 août 2009 11:48
-