IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Windows Forms Discussion :

If Else incompréhensible sous .net 2005


Sujet :

Windows Forms

  1. #1
    Membre averti
    Profil pro
    Inscrit en
    Décembre 2007
    Messages
    24
    Détails du profil
    Informations personnelles :
    Localisation : France, Côte d'Or (Bourgogne)

    Informations forums :
    Inscription : Décembre 2007
    Messages : 24
    Par défaut If Else incompréhensible sous .net 2005
    Bonjour à tous

    Je me heurte à un problème incompréhensible.
    J'ai un bout de code tout simple :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    Dim Test As String
    Test = ""
     
    If Test ="" Then
       Test ="1"
    Else
       Test ="2"
    End If
    Quand je suis en débug, pas de problème, le if fonctionne

    Par contre, en release, test passe bien à "1" mais le programme passe aussi dans le Else !!!

    Je me suis aperçu que en fait, la dernière instruction est systématiquement exécutée (et n'importe laquelle)
    Il suffit de rajouter une ligne de code après le If pour qu'il n'y ait plus de problème

    Par exemple, avec un Return à la fin, plus de problème, le programme ne passe plus dans le Else :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    Dim Test As String
    Test = ""
     
    If Test ="" Then
       Test ="1"
    Else
       Test ="2"
    End If
     
    Return
    Est-ce que quelqu'un a déjà eu ce cas-là ?

    Merci d'avance

  2. #2
    Membre Expert Avatar de OhMonBato
    Homme Profil pro
    Inscrit en
    Mars 2007
    Messages
    2 660
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Morbihan (Bretagne)

    Informations professionnelles :
    Secteur : Industrie

    Informations forums :
    Inscription : Mars 2007
    Messages : 2 660
    Par défaut
    Je doute que l'exemple que tu montres soit ton vrai code, car sinon autant mettre "Test" à 1 directement , peux tu nous montrer ton code réel stp ?

  3. #3
    Membre averti
    Profil pro
    Inscrit en
    Décembre 2007
    Messages
    24
    Détails du profil
    Informations personnelles :
    Localisation : France, Côte d'Or (Bourgogne)

    Informations forums :
    Inscription : Décembre 2007
    Messages : 24
    Par défaut
    Si tu veux mais ça changera pas grand-chose .
    Le code que j'ai mis, je l'ai essayé dans un projet vide pour voir justement si ça venait de mon vrai code (j'ai même fais l'essai sur un autre ordinateur pour voir et même résultat)

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    Private Structure UneBoite
            Public Boite As String
            Public Magasin As String
            Public NouveauMagasin As String
            Public Alveole As String
            Public NouvelleAlveole As String
            Public NouvelleAlveoleDisponible As Integer
            Public Quantite As String
            Public DateSortie As String
        End Structure
     
    Private BoiteASupprimer As UneBoite
     
        ''' <summary>
        ''' sélection de la nouvelle alvéole
        ''' </summary>
        ''' <param name="sender"></param>
        ''' <param name="e"></param>
        ''' <remarks></remarks>
        Private Sub TextEdit_Alveole_Validating(ByVal sender As Object, ByVal e As System.ComponentModel.CancelEventArgs) Handles TextEdit_Alveole.Validating
            P_OuvrirBase()
     
            UnEnreg = MaRequete.F_InterrogerDonnees( _
                "Select * From T_Alveole Where N_Alveole = '" & TextEdit_Alveole.Text & "'")
     
            With BoiteASupprimer
                While UnEnreg.Read
                    .NouvelleAlveole = UnEnreg.Item("N_Alveole").ToString
                    .NouveauMagasin = UnEnreg.Item("Magasin").ToString
                    .NouvelleAlveoleDisponible = CInt(UnEnreg.Item("Disponible"))
                End While
     
                P_FermerBase()
     
                If .NouvelleAlveole = "" Then
                    ErrorProvider_Application.SetError(TextEdit_Alveole, "Cette alvéole n'existe pas")
                Else
                    If .NouvelleAlveoleDisponible = 0 Then
                        .NouvelleAlveole = ""
                        .NouveauMagasin = ""
                        ErrorProvider_Application.SetError(TextEdit_Alveole, "Cette alvéole n'est pas disponible")
                    Else
                        ErrorProvider_Application.SetError(TextEdit_Alveole, "")
                        SimpleButton_ValiderDestruction_Click(sender ,e)
                    End If
                End If
            End With
        End Sub
    Dans mon cas, BoiteASupprimer.NouvelleAlveole est égal à chaine vide et pourtant SimpleButton_ValiderDestruction_Click(sender ,e) se déclenche

  4. #4
    Membre Expert Avatar de OhMonBato
    Homme Profil pro
    Inscrit en
    Mars 2007
    Messages
    2 660
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Morbihan (Bretagne)

    Informations professionnelles :
    Secteur : Industrie

    Informations forums :
    Inscription : Mars 2007
    Messages : 2 660
    Par défaut
    Ton problème me fait penser à ce sujet :
    http://www.developpez.net/forums/sho...d.php?t=569010

    De mon côté je viens de tester un code équivalent au tien sans soucis.

  5. #5
    Membre averti
    Profil pro
    Inscrit en
    Décembre 2007
    Messages
    24
    Détails du profil
    Informations personnelles :
    Localisation : France, Côte d'Or (Bourgogne)

    Informations forums :
    Inscription : Décembre 2007
    Messages : 24
    Par défaut
    Effectivement, ça ressemble à ce que j'ai

    Ce qui est bizarre, c'est que ça me le fait uniquement en release.

    J'ai même fais l'essai sur le pc d'un collègue et ça fait la même chose, donc c'est surement un problème de configuration mais alors là, ...

  6. #6
    Membre Expert Avatar de mactwist69
    Homme Profil pro
    Développement VB.NET
    Inscrit en
    Janvier 2007
    Messages
    1 707
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France, Saône et Loire (Bourgogne)

    Informations professionnelles :
    Activité : Développement VB.NET
    Secteur : Industrie

    Informations forums :
    Inscription : Janvier 2007
    Messages : 1 707
    Par défaut soluce.
    Juste avant ton "If", as tu tester ton resultat avec un :

    Msgbox (.NouvelleAlveole)
    Tu verras si c est a cause du If deja.

    Et 2emement, tu n utilise jamais de "New" ? Au tout debut de la procedure, si tu mais:

    Boiteasupprimer = new UneBoite
    Sans rien changer d autr ca fais rien?

  7. #7
    Membre Expert Avatar de Danyel
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Juillet 2005
    Messages
    1 699
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 55
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Juillet 2005
    Messages : 1 699
    Par défaut
    Etant curieux de ce phenomene, je viens de faire qq tests et je n'ai pas ce probleme, ni en debug, ni en release.
    Je suis egalement en .net 2005 (vs2005pro) et à jour (SP1)

    Microsoft Visual Studio 2005 Version 8.0.50727.867 (vsvista.050727-8600)
    Microsoft .NET Framework Version 2.0.50727 SP1
    Édition installée : Professional
    Verifie deja si tu es à jour.

  8. #8
    Membre averti
    Profil pro
    Inscrit en
    Décembre 2007
    Messages
    24
    Détails du profil
    Informations personnelles :
    Localisation : France, Côte d'Or (Bourgogne)

    Informations forums :
    Inscription : Décembre 2007
    Messages : 24
    Par défaut
    mactwist69 -->
    Le messagebox.show avant ne change rien. Par contre, dès que je mets une instruction après le if (par exemple return), quelle qu'elle soit, ça refonctionne.

    Le new n'est pas intéressant dans mon cas car la structure me sert uniquement d'espace de stockage que j'efface complement après (D'ailleurs, même en le mettant même résultat)

    Danyel ---> Je suis à jour avec le SP1 sous XP SP2 :
    version 8.0.50727.762 (SP.050727-7600)
    Framework version 2.0.50727 SP1
    Edition installée : standard

    Ce qui m'étonne encore plus, c'est que j'ai essayé hier sur 2 autres postes avec visual studio installé et ça fait la même chose

  9. #9
    Membre averti
    Profil pro
    Inscrit en
    Décembre 2007
    Messages
    24
    Détails du profil
    Informations personnelles :
    Localisation : France, Côte d'Or (Bourgogne)

    Informations forums :
    Inscription : Décembre 2007
    Messages : 24
    Par défaut
    Bon, je viens de comprendre ce qui se passe

    D'abord, il y avait un bug au niveau de mon code, je ne réinitialise pas BoiteASupprimer correctement

    Ensuite, en affichant le code machine pour voir ce qui se passe je viens de me rendre compte que en mode Release, tout ce qui n'est pas utile est enlevé. dans mon cas, les end if successifs de fin ne sont pas utiles car traduits en code machine par une seule et même instruction nop.

    Si je reprend ma variable Test, on obtient :

    Mode Debug :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
            Dim Test As String
     
            Test = ""
    0000002c  mov         eax,dword ptr ds:[023A303Ch] 
    00000032  mov         esi,eax 
     
            If Test = "" Then
    00000034  push        0    
    00000036  mov         edx,dword ptr ds:[023A303Ch] 
    0000003c  mov         ecx,esi 
    0000003e  call        59ADB258 
    00000043  mov         edi,eax 
    00000045  test        edi,edi 
    00000047  sete        al   
    0000004a  movzx       eax,al 
    0000004d  mov         ebx,eax 
    0000004f  test        ebx,ebx 
    00000051  je          0000005E 
                Test = "1"
    00000053  mov         eax,dword ptr ds:[023A3048h] 
    00000059  mov         esi,eax 
    0000005b  nop              
    0000005c  jmp         00000067 
            Else
    0000005e  nop              
                Test = "1"
    0000005f  mov         eax,dword ptr ds:[023A3048h] 
    00000065  mov         esi,eax 
            End If
    00000067  nop              
        End Sub
    00000068  nop              
    00000069  nop              
    0000006a  lea         esp,[ebp-0Ch] 
    0000006d  pop         ebx  
    0000006e  pop         esi  
    0000006f  pop         edi  
    00000070  pop         ebp  
    00000071  ret         4
    Mode Release :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
            Dim Test As String
     
            Test = ""
    00000000  push        edi  
    00000001  push        esi  
    00000002  sub         esp,8 
    00000005  mov         dword ptr [esp],ecx 
    00000008  mov         dword ptr [esp+4],edx 
    0000000c  cmp         dword ptr ds:[012D6CFCh],0 
    00000013  je          0000001A 
    00000015  call        756E0ACF 
    0000001a  xor         esi,esi 
    0000001c  mov         eax,dword ptr ds:[023A303Ch] 
    00000022  mov         esi,eax 
     
            If Test = "" Then
    00000024  push        0    
    00000026  mov         edx,dword ptr ds:[023A303Ch] 
    0000002c  mov         ecx,esi 
    0000002e  call        59A3B4E8 
    00000033  mov         edi,eax 
    00000035  test        edi,edi 
    00000037  jne         00000044 
                Test = "1"
    00000039  mov         eax,dword ptr ds:[023A3048h] 
    0000003f  mov         esi,eax 
    00000041  nop              
    00000042  jmp         0000004C 
            Else
                Test = "1"
    00000044  mov         eax,dword ptr ds:[023A3048h] 
    0000004a  mov         esi,eax 
    0000004c  nop              
    0000004d  add         esp,8 
    00000050  pop         esi  
    00000051  pop         edi  
    00000052  ret         4
    Donc visuellement, j'ai l'impression que le programme execute la dernière ligne, quelle qu'elle soit alors que ce n'est pas le cas, le programme va à l'adresse 0000004c

    Si on veut revenir comme dans le mode Debug et retrouver les end if, il faut aller dans Projet / propriétés du projet / Compiler / Options avancées de compilation et décocher Activer les optimisations

    Personnellement, maintenant que je sais comment ça marche, je vais laisser la case cochée car en terme de gain temps de traitement, je pense que ça vaut le coup

    Merci à tous

    Problème réglé


+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. VB.NET 2005 Erreur incompréhensible avec le code
    Par Herlece dans le forum Windows Forms
    Réponses: 10
    Dernier message: 20/12/2007, 20h28
  2. Application .NET 1.1 sous VS 2005
    Par XtraDelirium dans le forum Visual Studio
    Réponses: 2
    Dernier message: 24/10/2007, 14h29
  3. classwizar sous visual .net 2005?
    Par toutounesan dans le forum Visual C++
    Réponses: 1
    Dernier message: 06/10/2007, 17h19
  4. [VB.NET] Bug sous VS 2005
    Par ricil78 dans le forum Visual Studio
    Réponses: 6
    Dernier message: 06/03/2007, 14h54

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo