Erreur récurante de référence d'objet.

Résolu
whombat Messages postés 188 Date d'inscription mercredi 12 octobre 2005 Statut Membre Dernière intervention 19 novembre 2011 - 28 oct. 2011 à 10:11
whombat Messages postés 188 Date d'inscription mercredi 12 octobre 2005 Statut Membre Dernière intervention 19 novembre 2011 - 31 oct. 2011 à 06:18
Bonjour à tous,

Je cherche depuis plus de 24h mais je sèche. Pour moi tout est bon mais le déboger me dit : 'La référence d'objet n'est pas définie à une instance d'un objet.' Je sais (à peu près) ce que ça veut dire mais là...

Voilà mon code, pas long pourtant :


        Dim Words() As String
        Dim FileString As String = String.Empty
        Dim f As String = My.Application.Info.DirectoryPath & "\_VAR_PAYS_PL.txt"

        If File.Exists(f) Then
            System.IO.File.WriteAllText(f, My.Resources._VAR_PAYS_PL)
        Else
            MessageBox.Show("Fichier des Pays -> Langues impossible à trouver..." & vbCrLf & "Désolé...")
            Exit Sub
        End If

        Dim fr As New System.IO.StreamReader(CStr(f))
        Dim i%

        For i = 1 To 137

            FileString = fr.ReadLine
            If FileString = "" Then Exit For

            'la ligne lue est du style string*string*string séparateur '*'
            Words = Split(FileString, "*")

            X = 1
            
            'Il bugue ici, au mot Word semble-t-il :
            For Each Word As String In Words
                If X 1 Then TabPaysLang(i, 1) Word
                If X 2 Then TabPaysLang(i, 2) Word
                If X 3 Then TabPaysLang(i, 3) Word
                X = X + 1
            Next Word

        Next



J'ai tenté d'indexer les Word (0), (1) et (2) mais j'ai la même erreur.
Si quelqu'un a une idée, je suis réellement preneur. D'avance merci.

Cordialement,

Whombat.

42 réponses

whombat Messages postés 188 Date d'inscription mercredi 12 octobre 2005 Statut Membre Dernière intervention 19 novembre 2011
28 oct. 2011 à 17:38
Une fulgurance : en m'inspirant (en copiant lâchement) du code de mdevaux62 pour le début, je viens de coder à l'ancienne, ce bon vieux VB 1... :


        Dim lignes As String() = (My.Resources._VAR_PAYS_PL).Split(vbCrLf)
        Dim idLigne As Integer = 0
        For Each ligne As String In lignes
            Mot = ""
            For i = 1 To ligne.Length
                Ch = Mid(ligne, i, 1)
                If Ch = "*" Then
                    If Mot1 = "" Then
                        TabPaysLang(idLigne, 0) = Mot
                        Mot = ""
                    ElseIf Mot2 = "" Then
                        TabPaysLang(idLigne, 1) = Mot
                        Mot = ""
                    End If
                Else
                    Mot = Mot & Ch
                End If
                TabPaysLang(idLigne, 2) = Mot
            Next
            MessageBox.Show(Mot1 & "   " & Mot2 & "   " & Mot3)
            idLigne += 1
        Next



et ça fonctionne ! Preuve que ce n'est pas une variable coincée antérieurement, ou autre parasite. Mais d'où ça vient ? Mystère !
Je crois que je vais garder ça parce que je ne compte pas passer le week end à continuer à me prendre la tête. Un jour, peut-être, ayant mûri et grandi dans l'expérience, pour le fun je reviendrais taquiner ce snippet mais pour l'instant je vais en rester là.

Merci à tous ceux qui ont transpiré avec moi. Résoudre le pb avec l'oeuf de Colomb c'est vexant quand on apprend le Net, et VB 2010... Mais si il faut, il faut...

Merci encore à tous.

Cordialement,

Whombat.
3
ucfoutu Messages postés 18038 Date d'inscription lundi 7 décembre 2009 Statut Modérateur Dernière intervention 11 avril 2018 211
28 oct. 2011 à 10:24
Bonjour,

l'array obtenu par split n'est probablement pas de type string, mais variant (si comme sous VB6)
ligne à corriger, dans ce cas :
For Each Word As String In Words
Ou rien ou variant à la place de string.

____________________
Réponse exacte ? => "REPONSE ACCEPTEE" pour faciliter les recherches d'autres forumeurs.
Pas d'aide en ligne installée ? ==> ne comptez pas sur moi pour simplement vous dire ce qu'elle contient
0
whombat Messages postés 188 Date d'inscription mercredi 12 octobre 2005 Statut Membre Dernière intervention 19 novembre 2011
28 oct. 2011 à 10:33
Merci pour cette réponse rapide.

Je viens d'essayer et j'ai la même erreur. Code corrigé :


            For Each Word In Words
                                          'bugue ici :
                If X 1 Then TabPaysLang(i, 1) Word
                If X 2 Then TabPaysLang(i, 2) Word
                If X 3 Then TabPaysLang(i, 3) Word
            next



Cordialement,

Whombat.
0
ucfoutu Messages postés 18038 Date d'inscription lundi 7 décembre 2009 Statut Modérateur Dernière intervention 11 avril 2018 211
28 oct. 2011 à 10:41
Et cette nouvelle erreur est maintenant autre chose !
Elle est liée à l'existence (à ses dimensions, à son accessibilité et à son type), tu tableau dynamique TabPaysLang()
Qu'on ne voit pas dans ton code.


____________________
Réponse exacte ? => "REPONSE ACCEPTEE" pour faciliter les recherches d'autres forumeurs.
Pas d'aide en ligne installée ? ==> ne comptez pas sur moi pour simplement vous dire ce qu'elle contient
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
whombat Messages postés 188 Date d'inscription mercredi 12 octobre 2005 Statut Membre Dernière intervention 19 novembre 2011
28 oct. 2011 à 10:49
Mon tableau est une variable globale dans le module :
Public TabPaysLang(137, 3) as string

Cordialement,

Whombat.
0
ucfoutu Messages postés 18038 Date d'inscription lundi 7 décembre 2009 Statut Modérateur Dernière intervention 11 avril 2018 211
28 oct. 2011 à 11:02
Alors je ne vois plus !
1) Essaye d'utiliser autre chose que le mot Word (pour le cas où)
2) déclare ton tableau as Variant

Si ne fonctionne toujours pas : j'abdique en ce qui me concerne.


____________________
Réponse exacte ? => "REPONSE ACCEPTEE" pour faciliter les recherches d'autres forumeurs.
Pas d'aide en ligne installée ? ==> ne comptez pas sur moi pour simplement vous dire ce qu'elle contient
0
ucfoutu Messages postés 18038 Date d'inscription lundi 7 décembre 2009 Statut Modérateur Dernière intervention 11 avril 2018 211
28 oct. 2011 à 11:08
Et au passage (mais n'explique pas ton problème ! juste en passant) :
 For Each Word As String In Words
                If X 1 Then TabPaysLang(i, 1) Word
                If X 2 Then TabPaysLang(i, 2) Word
                If X 3 Then TabPaysLang(i, 3) Word
                X = X + 1
            Next Word

équivaut à :
For Each Word As String In Words
               TabPaysLang(i, X) = Word
            Next Word



____________________
Réponse exacte ? => "REPONSE ACCEPTEE" pour faciliter les recherches d'autres forumeurs.
Pas d'aide en ligne installée ? ==> ne comptez pas sur moi pour simplement vous dire ce qu'elle contient
0
ucfoutu Messages postés 18038 Date d'inscription lundi 7 décembre 2009 Statut Modérateur Dernière intervention 11 avril 2018 211
28 oct. 2011 à 11:09
pardon (une ligne supprimée en trop) :
For Each Word As String In Words
               TabPaysLang(i, X) = Word
               X = X + 1
 Next Word




____________________
Réponse exacte ? => "REPONSE ACCEPTEE" pour faciliter les recherches d'autres forumeurs.
Pas d'aide en ligne installée ? ==> ne comptez pas sur moi pour simplement vous dire ce qu'elle contient
0
whombat Messages postés 188 Date d'inscription mercredi 12 octobre 2005 Statut Membre Dernière intervention 19 novembre 2011
28 oct. 2011 à 11:20
Rectification faite, au cas où :

Nouveau code :

         
        'J'ai changé Words en dWords et Word en dWord pour voir
        Dim dWords() As String

        'tableau déclaré dans la sub pour que ce soit + clair
        Dim TabLangPays(137, 3) As Object  

        Dim FileString As String = String.Empty
        Dim f As String = My.Application.Info.DirectoryPath & "\_VAR_PAYS_PL.txt"

        If File.Exists(f) Then
            System.IO.File.WriteAllText(f, My.Resources._VAR_PAYS_PL)
        Else
            MessageBox.Show("Fichier des Pays -> Langues impossible à trouver..." & vbCrLf & "Désolé...")
            Exit Sub
        End If

        Dim fr As New System.IO.StreamReader(CStr(f))
        Dim i%

        For i = 1 To 137

            FileString = fr.ReadLine
            If FileString = "" Then Exit For
            dWords = Split(FileString, "*")

            X = 1
            For Each dWord In dWords
                                '
                                'toujours l'erreur ici :
                If X 1 Then TabPaysLang(i, 1) dWord
                If X 2 Then TabPaysLang(i, 2) dWord
                If X 3 Then TabPaysLang(i, 3) dWord
                X = X + 1
            Next dWord

        Next



C'est à ne plus rien y comprendre... Ca fait des heures et des heures que je suis dessus. Et ça me bloque. Si je dois passer autrement, c'est toute la philosophie du script qui est à reécrire car des fichiers comme ça à lire j'en ai un grand nombre ! Et bien sûr, à les constituer, cela m'a pris déjà de nombreux jours...

Y'a pas à faire, si VB bugue c'est qu'il y a quelque chose, mais où...

J'ai arrété le PC et relancé VB au cas où il 'serait fatigué'... Mais il a le bon oeil ... Il m'a trouvé (re-trouvé) tout de suite l'erreur.

Cordialement,

Whombat.
0
mdevaux62 Messages postés 111 Date d'inscription dimanche 24 décembre 2000 Statut Membre Dernière intervention 17 novembre 2012 7
28 oct. 2011 à 12:54
J'ai un peu modifié ton code.
Je lis le fichier texte en ressource sans le copier.
J'extrait les lignes puis les mots :

        'Je charge toutes les lignes du fichier texte qui est en ressource (_VAR_PAYS_PL.txt)
        Dim lignes As String() = (My.Resources._VAR_PAYS_PL).Split(vbCrLf)
        Dim idLigne As Integer = 1
        For Each ligne As String In lignes
            'Pour chaque ligne, je sépare les mots
            Dim X As Integer = 1
            Dim words As String() = ligne.Split("*")
            For Each word As String In words
                'Les mots sont placés dans le tableau
                TabPaysLang(idLigne, X) = word
                'Mot suivant
                X += 1
            Next
            'Ligne suivante
            idLigne += 1
        Next
0
cs_ShayW Messages postés 3253 Date d'inscription jeudi 26 novembre 2009 Statut Membre Dernière intervention 3 décembre 2019 57
28 oct. 2011 à 12:58
Salut

 Words = Split(FileString, "*")


en Net
split est une des méthodes de la class string

ex
dim words() as string
  dim   machaine as string
   machaine = "comment allez vous"
  words = machaine.split(" ")
0
whombat Messages postés 188 Date d'inscription mercredi 12 octobre 2005 Statut Membre Dernière intervention 19 novembre 2011
28 oct. 2011 à 13:16
Merci pour la réponse, ShayW.

J'ai bien peur que cela crée toujours la même erreur et au même endroit . Voilà le code corrigé :


        Dim TabPaysLang(137,3) as string
        Dim dWords() As String
        Dim dWord As String
        Dim FileString As String = String.Empty
        Dim f As String = My.Application.Info.DirectoryPath & "\_VAR_PAYS_PL.txt"

        If File.Exists(f) Then
            System.IO.File.WriteAllText(f, My.Resources._VAR_PAYS_PL)
        Else
            MessageBox.Show("Fichier des Pays -> Langues impossible à trouver..." & vbCrLf & "Désolé...")
            Exit Sub
        End If

        Dim fr As New System.IO.StreamReader(CStr(f))
        Dim i%

        For i = 1 To 137

            FileString = fr.ReadLine
            If FileString = "" Then Exit For
            dWords = FileString.Split("*")

            X = 1
            For Each dWord In dWords
                TabPaysLang(i, X) = dWord
                X = X + 1
            Next dWord

        Next i



N.B. J'ai essayé également de ne pas déclarer dWord as string au début mais au niveau du For (For Each dWord as string...) -> rien n'y fait !
Je n'arrive pas à comprendre mais il faut dire que j'ai un peu moins de 50 jours de pratique de VB 2010. Je suis court. Je n'ai pas la compétence nécessaire pour bien des parties de VB mais là, en l'occurrence, il me semble que c'est assez 'maternelle' pour que je m'aperçoive de l'erreur.

Ceci dit, je n'aurais pas trouvé le Split de Net, habitué à l'autre syntaxe. Certes, j'ai du la voir en passant mais comme mon esprit ne se posait pas la question, je n'avais pas retenu. Et donc merci pour cette piqûre de rappel.

Cordialement,

Whombat.

Prédire l'avenir est particulièrement aléatoire, 
surtout lorsqu'il s'agit du futur.
0
ucfoutu Messages postés 18038 Date d'inscription lundi 7 décembre 2009 Statut Modérateur Dernière intervention 11 avril 2018 211
28 oct. 2011 à 13:36
Je suis par ailleurs étonné de ce que l'on commence avec un X = 1 (que l'on incrémente ensuite)
Pour moi, l'array obtenu par le split commence à l'index 0 et non 1
et dans ce cas, incrémenter X avec each et en commençant par 1 ne peut que conduire au précipice.


____________________
Réponse exacte ? => "REPONSE ACCEPTEE" pour faciliter les recherches d'autres forumeurs.
Pas d'aide en ligne installée ? ==> ne comptez pas sur moi pour simplement vous dire ce qu'elle contient
0
whombat Messages postés 188 Date d'inscription mercredi 12 octobre 2005 Statut Membre Dernière intervention 19 novembre 2011
28 oct. 2011 à 13:43
J'en conviens mais le tableau TabPaysLang, lui, commence à 1...

Whombat.
0
cs_ShayW Messages postés 3253 Date d'inscription jeudi 26 novembre 2009 Statut Membre Dernière intervention 3 décembre 2019 57
28 oct. 2011 à 14:46
Dim TabPaysLang(137,3) as string


varie de 0,0 à 137 3
donc on a length 138 * 4 552
index commence par 0 faire attention
0
whombat Messages postés 188 Date d'inscription mercredi 12 octobre 2005 Statut Membre Dernière intervention 19 novembre 2011
28 oct. 2011 à 14:57
Exact, bien vu, j'avais complètement oublié cette façon de compter. Pourtant Lasserre y revient au moins 10 fois...

Je vais contrôler si cela a une incidence et je reviens.

Cordialement,

Whombat.
0
whombat Messages postés 188 Date d'inscription mercredi 12 octobre 2005 Statut Membre Dernière intervention 19 novembre 2011
28 oct. 2011 à 15:04
Même erreur... A devenir fou !

Nouveau code :


        Dim TabPaysLang(0 to 136,0 to 2) as string
        Dim dWords() As String
        Dim dWord As String
        Dim FileString As String = String.Empty
        Dim f As String = My.Application.Info.DirectoryPath & "\_VAR_PAYS_PL.txt"

        If File.Exists(f) Then
            System.IO.File.WriteAllText(f, My.Resources._VAR_PAYS_PL)
        Else
            MessageBox.Show("Fichier des Pays -> Langues impossible à trouver..." & vbCrLf & "Désolé...")
            Exit Sub
        End If

        Dim fr As New System.IO.StreamReader(CStr(f))
        Dim i%

        For i = 0 To 136

            FileString = fr.ReadLine
            If FileString = "" Then Exit For
            dWords = FileString.Split("*")

            X = 0
            For Each dWord In dWords
                TabPaysLang(i, X) = dWord
                X = X + 1
            Next dWord

        Next i




J'ai le sentiment que VB est possédé par un lutin qui s'amuse... On est bientôt à Halloween...

Cordialement,

Whombat.
0
cs_ShayW Messages postés 3253 Date d'inscription jeudi 26 novembre 2009 Statut Membre Dernière intervention 3 décembre 2019 57
28 oct. 2011 à 15:06
ce n'est pas ça
mais
For Each dWord In dWords
      TabPaysLang(i, X) = dWord
      X = X + 1
   Next dWord

dès que X dépasse 3 alors runtime error
0
mdevaux62 Messages postés 111 Date d'inscription dimanche 24 décembre 2000 Statut Membre Dernière intervention 17 novembre 2012 7
28 oct. 2011 à 16:24
Testé et ça marche :
Maintenant tu en fais ce que tu en veux :

'Je charge toutes les lignes du fichier texte qui est en ressource (_VAR_PAYS_PL.txt)
        Dim lignes As String() = (My.Resources._VAR_PAYS_PL).Split(vbCrLf)
        Dim idLigne As Integer = 1 '0 serait plus judicieux , mais bon ...
        For Each ligne As String In lignes
            'Pour chaque ligne, je sépare les mots
            Dim X As Integer = 1   '0 serait plus judicieux , mais bon ...
            Dim words As String() = ligne.Split("*")
            For Each word As String In words
                'Les mots sont placés dans le tableau
                TabPaysLang(idLigne, X) = word
                'Mot suivant
                X += 1
            Next
            'Ligne suivante
            idLigne += 1
        Next
0
whombat Messages postés 188 Date d'inscription mercredi 12 octobre 2005 Statut Membre Dernière intervention 19 novembre 2011
28 oct. 2011 à 17:01
mdevaux62, j'aimerais te sauter au cou mais.... toujours la même erreur, au même endroit et dès le premier passage.

Voilà ce qu'il me met, lorsque je mets l'exception dans le presse-papier :



L'exception System.NullReferenceException n'a pas été gérée
Message=La référence d'objet n'est pas définie à une instance d'un objet.
Source=ASE
StackTrace:
à ASE.Options.ChargeTabPaysLang() dans D:\--- PROJETS\VB10\ASE\ASE\Options.vb:ligne 114
à ASE.Options.ChargeListLang(Int32 Sens) dans D:\--- PROJETS\VB10\ASE\ASE\Options.vb:ligne 211
à ASE.Options.Options_Load(Object sender, EventArgs e) dans D:\--- PROJETS\VB10\ASE\ASE\Options.vb:ligne 99
à System.Windows.Forms.Form.OnLoad(EventArgs e)
à System.Windows.Forms.Form.OnCreateControl()
à System.Windows.Forms.Control.CreateControl(Boolean fIgnoreVisible)
à System.Windows.Forms.Control.CreateControl()
à System.Windows.Forms.Control.WmShowWindow(Message& m)
à System.Windows.Forms.Control.WndProc(Message& m)
à System.Windows.Forms.ScrollableControl.WndProc(Message& m)
à System.Windows.Forms.Form.WmShowWindow(Message& m)
à System.Windows.Forms.Form.WndProc(Message& m)
à System.Windows.Forms.Control.ControlNativeWindow.OnMessage(Message& m)
à System.Windows.Forms.Control.ControlNativeWindow.WndProc(Message& m)
à System.Windows.Forms.NativeWindow.DebuggableCallback(IntPtr hWnd, Int32 msg, IntPtr wparam, IntPtr lparam)
à System.Windows.Forms.SafeNativeMethods.ShowWindow(HandleRef hWnd, Int32 nCmdShow)
à System.Windows.Forms.Control.SetVisibleCore(Boolean value)
à System.Windows.Forms.Form.SetVisibleCore(Boolean value)
à System.Windows.Forms.Control.Show()
à ASE.Main.Main_Load(Object sender, EventArgs e) dans D:\--- PROJETS\VB10\ASE\ASE\Main.vb:ligne 82
à System.EventHandler.Invoke(Object sender, EventArgs e)
à System.Windows.Forms.Form.OnLoad(EventArgs e)
à System.Windows.Forms.Form.OnCreateControl()
à System.Windows.Forms.Control.CreateControl(Boolean fIgnoreVisible)
à System.Windows.Forms.Control.CreateControl()
à System.Windows.Forms.Control.WmShowWindow(Message& m)
à System.Windows.Forms.Control.WndProc(Message& m)
à System.Windows.Forms.ScrollableControl.WndProc(Message& m)
à System.Windows.Forms.Form.WmShowWindow(Message& m)
à System.Windows.Forms.Form.WndProc(Message& m)
à System.Windows.Forms.Control.ControlNativeWindow.OnMessage(Message& m)
à System.Windows.Forms.Control.ControlNativeWindow.WndProc(Message& m)
à System.Windows.Forms.NativeWindow.DebuggableCallback(IntPtr hWnd, Int32 msg, IntPtr wparam, IntPtr lparam)
à System.Windows.Forms.SafeNativeMethods.ShowWindow(HandleRef hWnd, Int32 nCmdShow)
à System.Windows.Forms.Control.SetVisibleCore(Boolean value)
à System.Windows.Forms.Form.SetVisibleCore(Boolean value)
à System.Windows.Forms.Control.set_Visible(Boolean value)
à System.Windows.Forms.Application.ThreadContext.RunMessageLoopInner(Int32 reason, ApplicationContext context)
à System.Windows.Forms.Application.ThreadContext.RunMessageLoop(Int32 reason, ApplicationContext context)
à Microsoft.VisualBasic.ApplicationServices.WindowsFormsApplicationBase.OnRun()
à Microsoft.VisualBasic.ApplicationServices.WindowsFormsApplicationBase.DoApplicationModel()
à Microsoft.VisualBasic.ApplicationServices.WindowsFormsApplicationBase.Run(String[] commandLine)
à ASE.My.MyApplication.Main(String[] Args) dans 17d14f5c-a337-4978-8281-53493378c1071.vb:ligne 81
à System.AppDomain._nExecuteAssembly(RuntimeAssembly assembly, String[] args)
à System.AppDomain.ExecuteAssembly(String assemblyFile, Evidence assemblySecurity, String[] args)
à Microsoft.VisualStudio.HostingProcess.HostProc.RunUsersAssembly()
à System.Threading.ThreadHelper.ThreadStart_Context(Object state)
à System.Threading.ExecutionContext.Run(ExecutionContext executionContext, ContextCallback callback, Object state, Boolean ignoreSyncCtx)
à System.Threading.ExecutionContext.Run(ExecutionContext executionContext, ContextCallback callback, Object state)
à System.Threading.ThreadHelper.ThreadStart()
InnerException:



Je ne sais pas lire (je n'y comprends encore pas assez) ce genre de littérature. Si vous pouvez y trouver qq chose.

N.B. J'ai mis des 0 à la place des 1 puisque, dans un message précédent, j'avais fait démarrer mon tableau à 0 et non pas à 1 (erreur et bétise personnelle) TabPaysLang(0 to 136, 0 to 2) as string

Mais si ça avait fonctionné, j'aurais bien aimé qu'on me dise pourquoi.

Cordialement,

Whombat.
0
Rejoignez-nous