Comment ? Je n'étais pas censé faire cela ! Identification des erreurs de logique

Mise à jour : novembre 2007

Dans cette leçon, vous apprendrez comment rechercher des erreurs de logique dans votre programme.

Dans les leçons précédentes, vous avez appris comment rechercher et résoudre des erreurs de compilation et d'exécution. Le troisième type d'erreur de programmation, les erreurs de logique, est sans doute le plus difficile de l'identifier. Les erreurs de logique ne génèrent aucun avertissement ; le programme s'exécute, mais vous obtenez des résultats incorrects. Vous devez alors lire votre code et déterminer pourquoi.

Heureusement, les outils de débogage de Visual Basic peuvent vous aider. Deux techniques de débogage, définir des points d'arrêt et progresser pas à pas dans le code, vous aident à inspecter votre code ligne par ligne dans le sens de son exécution pour identifier l'erreur.

Vous pouvez définir un point d'arrêt dans l'éditeur de code sur toute ligne de code exécutable. Lorsque le programme s'exécute, les points d'arrêt le forcent à s'arrêter et à passer en mode arrêt une fois cette ligne de code atteinte. Vous pouvez ensuite obtenir les informations souhaitées à propos de l'état du programme à ce moment précis. Vous pouvez alors vérifier la valeur d'une variable, tester des expressions dans la fenêtre Exécution ou apporter des modifications à votre code avec la fonctionnalité Modifier & Continuer.

Une fois en mode arrêt, vous pouvez progresser pas à pas dans votre code, en l'exécutant ligne par ligne, afin de pouvoir examiner son fonctionnement. Appuyer sur la touche F8 entraîne l'exécution de la ligne de code courante, puis l'arrêt sur la ligne suivante. Vous pouvez alors inspecter les valeurs des variables pour voir si elles ont été modifiées d'une ligne à l'autre.

Si la ligne de code active appelle une fonction ou une procédure Sub présente à un autre endroit dans votre code, l'exécution passe directement à cette procédure lorsque vous appuyez sur F8. Lorsque vous avez exécuté cette procédure pas à pas, vous êtes envoyé à la ligne qui suit celle qui a appelé la procédure. Si vous ne souhaitez pas exécuter la procédure pas à pas, appuyez sur MAJ+F8 pour l'ignorer.

Essayez !

Pour observer une erreur de logique

  1. Dans le menu Fichier, choisissez Nouveau projet.

  2. Dans la boîte de dialogue Nouveau projet, dans le volet Modèles, cliquez sur Application Windows.

  3. Dans la zone Nom, tapez LogicErrors, puis cliquez sur OK.

    Un nouveau projet Windows Forms s'ouvre.

  4. À partir de la Boîte à outils, faites glisser deux contrôles TextBox et un contrôle Button dans le formulaire.

  5. Double-cliquez sur Button1 pour ouvrir l'éditeur de code.

  6. Dans le gestionnaire d'événements Button1_Click, ajoutez le code suivant.

    Dim minutes As Integer = CInt(Textbox1.Text)
    Dim miles As Double = CDbl(Textbox2.Text)
    Dim hours As Double = 0
    hours = minutes / 60
    MsgBox("Average speed " & GetMPH(hours, miles))
    
  7. Sous la ligne End Sub, ajoutez la fonction suivante :

    Function GetMPH(ByVal miles As Double, ByVal hours As Double) _
    As String
        GetMPH = CStr(miles / hours)
    End Function
    
  8. Appuyez sur F5 pour exécuter le programme. Dans la première zone de texte, entrez 10 (pour représenter 10 minutes) et dans la deuxième, entrez 5 (pour représenter 5 miles), puis cliquez sur Button1.

    Un message s'affiche et donne la vitesse moyenne : "Average speed 0.03333334". Toutefois, si vous parcourez cinq miles en dix minutes, la réponse correcte est 30 mph.

    Laissez le projet ouvert ; dans la procédure suivante, vous apprendrez comment trouver l'erreur de logique.

Identification des erreurs de logique

La logique de programmation du dernier exemple pose de toute évidence un problème. D'après le résultat, vous vous déplacez à moins d'un mile (soit 1 609 m) par heure, et non à trente miles à l'heure comme prévu. Où est l'erreur ?

Dans la procédure suivante, vous définirez un point d'arrêt et progresserez pas à pas dans le code pour localiser l'erreur.

Essayez !

Pour définir un point d'arrêt et progresser pas à pas dans le code

  1. Dans l'éditeur de code, recherchez la ligne hours = minutes / 60, puis cliquez dans la marge de gauche en regard de cette ligne de code.

    Un point rouge doit s'afficher dans la marge et le code doit être mis en surbrillance en rouge, pour représenter un point d'arrêt.

  2. Appuyez sur F5 pour exécuter à nouveau le programme. Dans la première zone de texte, entrez 10 et dans la deuxième zone de texte, entrez 5. Ensuite, cliquez sur Button1.

    Le programme s'arrête lorsqu'il atteint le point d'arrêt. La ligne hours = minutes / 60 est surlignée en jaune.

    Inspectez les valeurs des variables en maintenant le pointeur de la souris sur celles-ci. La valeur de hours doit être 0 et celle de minutes10.

  3. Appuyez sur F8 pour exécuter la ligne hours = minutes / 60 et passer à la ligne suivante.

    Inspectez les valeurs des variables présentes sur la ligne MsgBox("Average speed " & GetMPH(hours, miles)) ; la valeur de hours doit être maintenant 0.166666672, et celle de miles5.0.

  4. Appuyez à nouveau sur F8 pour exécuter la ligne active.

    Remarquez que l'exécution descend à la ligne Function GetMPH.

    Inspectez les valeurs des variables présentes sur cette ligne. Remarquez que la valeur de miles est à présent 0.166666672, et celle de hours à présent 5.0 ; le contraire de ce qu'elles étaient sur la ligne précédente. Vous venez d'identifier l'erreur.

    Laissez le projet ouvert ; dans la procédure suivante, vous apprendrez comment corriger l'erreur de logique.

Correction des erreurs de logique

Dans la procédure ci-dessus, les valeurs des variables miles et hours ont été interverties. Sauriez-vous dire pourquoi ?

Si vous examinez la ligne MsgBox("Average speed " & GetMPH(hours, miles)), vous constatez que les deux arguments, hours et miles, dans cet ordre, sont passés à la fonction GetMPH. Or, si vous examinez la déclaration de fonction Function GetMPH(ByVal miles As Double, ByVal hours As Double)..., vous remarquez que les arguments sont répertoriés de la manière suivante : miles en premier (miles) et les heures (hours) en second.

Une erreur de logique s'est produite parce que les arguments sont passés dans le désordre, entraînant ainsi un calcul erroné. Si les arguments avaient été de types différents, une erreur d'exécution se serait produite. Mais ici, ces arguments sont de même type ; aussi, aucune erreur d'exécution n'a lieu. S'il s'agit une erreur simple, le bogue qui en résulte n'en est pas moins difficile à trouver.

Dans la procédure suivante, vous définirez un point d'arrêt et progresserez pas à pas dans le code pour localiser l'erreur.

Essayez !

Pour corriger l'erreur de logique

  1. Dans l'éditeur de code, modifiez comme suit la ligne MsgBox("Average speed " & GetMPH(hours, miles)) :

    MsgBox("Average speed " & GetMPH(miles, hours))
    
  2. Effacez le point d'arrêt en cliquant sur le point rouge dans la marge de gauche.

  3. Appuyez sur F5 pour exécuter le programme. Dans la première zone de texte, entrez 10 et dans la deuxième zone de texte, entrez 5. Ensuite, cliquez sur Button1.

    Cette fois, le message doit afficher le résultat correct : "Average speed 30".

    Le programme peut sembler corrigé, mais une erreur de logique encore plus difficile à identifier est encore présente. Si vous souhaitez essayer de la chercher, laissez le projet ouvert ; vous l'utiliserez à nouveau dans la leçon Bogue supplémentaire : quelque chose ne fonctionne toujours pas.

Étapes suivantes

Dans cette leçon, vous avez appris comment rechercher et corriger une erreur de logique. À ce stade, vous pouvez passer à la leçon suivante sur l'utilisation des commentaires ou essayer de rechercher une autre erreur de logique dans Bogue supplémentaire : quelque chose ne fonctionne toujours pas.

Leçon suivante : Prise de notes dans vos programmes : utilisation des commentaires

Voir aussi

Tâches

Ça ne fonctionne pas ! Recherche et suppression des erreurs d'exécution

Connaissance des bogues : trois types d'erreurs de programmation

Recherche des erreurs : introduction au débogage Visual Basic