suite au TP précédent¶

Que faire face à un "bug" ? ...¶

image.png

  • on change les noms des variables ?
  • on essaye de programmer la fonction autrement ?
  • on échange des lignes au hasard ?
  • on jette tout son code à la poubelle ?
  • on jette l'ordinateur à la poubelle ?

Non ...¶

On applique une démarche systématique ...

Quelle "sorte" de bug ?¶

selon la "sorte" de bug, les remèdes diffèrent ...

Est-ce une erreur de syntaxe ?¶

Syntax error : l'interpréteur Python n'arrive pas à comprendre ce que vous avez écrit

bien examiner la ligne indiquée, ou la précédente

  • "étourderie" : erreur d'indentation, parenthèse oubliée, oubli d'un :
  • ou bien : on révise la façon de s'exprimer en Python (cf Mémo Python)

NB : en cas d'erreur de syntaxe ... inutile d'ajouter des prints

Est-ce une erreur d'exécution ?¶

l'interpréteur Python a compris ce que vous avez écrit, et commencé l'exécution du programme, mais réalise une opération invalide

Par exemple : accéder à l'indice 7 d'une liste de 3 éléments

  • on identifie l'opération qui déclenche l'erreur (pile des appels en cours)

  • on comprend la nature de l'erreur

NB : en Python, on sait facilement ce qui pose problème exactement

Est-ce que le programme a un comportement inattendu ?¶

affichage d'une information incohérente ...

Il faut remonter à la source ... essayer d'isoler le problème et d'écrire un test qui échoue

En cas d'échec d'un test ?¶

On suit l'exécution pas à pas jusqu'à trouver le problème ...

  • si tout ne s'exécute pas comme prévu : (exemple : croire qu'on fait une copie de liste, alors que ce n'est pas le cas)

c'est erreur de compréhension du modèle d'exécution (Diapo 3)

  • si tout s'exécute comme vous l'aviez prévu ... :

c'est que l'algorithme incorrect ...

"Traquer le bug" en MP2I/MPI¶

cf synthèse de cours

Objectif de la séance¶

Comprendre parfaitement :

  • le flot d'exécution du programme

  • la représentation en mémoire des objets manipulés par l'exécutant

Diaporama n°3¶

Que fait l'Exécutant ?¶

L'exécutant fait ce que le programmeur lui dit de faire ...¶

Comment l'exécutant procède-t-il ?¶

Comprendre l'exécution d'un programme dans les détails¶

obéir à des instructions à réaliser en tenant compte des variables en mémoire ?

ça semble facile ...

ce n'est pas forcément le cas !

Python Tutor https://pythontutor.com/

image.png

Exécution (sans fonction)¶

  • exemple 1 sans listes
  • exemple 2 avec des listes
  • exemple 3 avec des listes

A retenir - manipulations de liste en Python :

  • La variable ne contient pas la liste, mais une référence vers la liste (l'adresse de la liste)
  • une affectation de liste ne réalise pas une copie
  • la concaténation crée une nouvelle liste
  • L.append(x) modifie la liste L
  • ...

Que dire du code suivant ?¶

Créer une liste de zéros : mauvais exemple

  • Très coûteux : nombreuses créations de listes (nb : les listes non utilisées disparaissent automatiquement)

On privilégiera bon exemple qui ne crée qu'une seule liste

Exécution (avec un seul appel de fonction)¶

  • exemple 4

A retenir - appel de fonction :

  • la définition d'une fonction crée une variable globale
  • lors de l'appel, les paramètres formels (ici a et b) sont des variables qui contiennent les valeurs passées en argument.
  • la variables a b et y n'existent que pendant l'exécution du corps de la fonction : ce sont des variables locales
  • l'exécutant garde en mémoire l'endroit où l'appel a été réalisé

Et avec les listes ...

  • exemple 5

A retenir - appel de fonction + liste :

  • une fonction est susceptible de modifier une liste passée en argument
  • c'est la référence vers la liste qui est passée à la fonction

Remarque importante¶

  • Les noms des paramètres et des variables locales à une fonction sont "internes" à la fonction.
  • On peut les renommer sans changer ce que fait la fonction (ce ne sont que des symboles).
In [1]:
def f(x,y):
    z = x-y
    return z**2
In [2]:
def f(mozart, bach):
    vivaldi = mozart - bach
    return vivaldi**2

Dans les deux cas, f(3,5) produira exactement le même calcul

Exécution (avec plusieurs appels)¶

  • exemple 6
    • ici, malgré les apparences, les appels sont sucessifs ...
  • exemple 7
    • ici, les appels sont imbriqués :
      • l'appel à f déclenche l'appel à f1 ...
      • ... qui déclenche l'appel à f2 (alors que l'appel à f est toujours en cours
    • L'exécutant garde trace de tout cela dans la pile d'appels en cours

La pile des appels en cours¶

Elle est apparaît dans la console en cas d'erreur à l'exécution

image.png

Variables et organisation de la mémoire¶

cf cours¶

Complément : Le Débogueur¶

  • Hors-programme

  • Outil du programmeur qui permet de suivre pas à pas l'exécution du programme,

  • on peut définir des points d'arrêts

  • exécuter le code jusqu'à atteindre un point d'arrêt,

  • reprendre l'exécution

  • connaître le contenu des variables.

  • ...

  • A essayer en TP (pour les plus à l'aise)