Adloun

Vide ou pleine : le témoin qui ment

Exercice · niveau 2 · informatique (MP2I/MPI), chapitre 7 — Structures séquentielles : listes, piles, files

Énoncé

Une file circulaire est écrite avec deux indices debut et fin, sans compteur, et est_vide teste debut == fin. Montrer que cette réalisation est fausse, et comparer les deux parades.

Corrigé

Mesuré, avec une capacité de :


file neuve          : debut=0 fin=0   est_vide dit VIDE       correct
apres 8 enfilages   : debut=0 fin=0   est_vide dit VIDE       FAUX
   or le tableau contient [100 101 102 103 104 105 106 107]

Le défaut nommé. L'indice fin avance modulo ; après huit enfilages il a fait un tour complet et revient sur . Les deux états « aucun élément » et « huit éléments » ont donc le même témoin, et aucune fonction ne peut les distinguer. Ce n'est pas un défaut de codage : c'est un défaut de représentation — deux états du monde, une seule image.

Les deux parades.

Comment trancher. Si les éléments sont gros et la capacité petite, une case perdue coûte plus qu'un entier : on retient . Si la structure est manipulée par plusieurs fils d'exécution, la seconde parade a un avantage réel — elle n'a que deux champs à mettre à jour au lieu de trois, ce qui limite les états intermédiaires incohérents (chapitre chap:concurrence).

Ce que l'exercice enseigne au-delà des files. Avant d'écrire une structure, comptez les états qu'elle doit distinguer et les valeurs que sa représentation peut prendre. Si les seconds sont moins nombreux que les premiers, la représentation est fausse, et aucun soin apporté au code ne la sauvera. Ici : tailles possibles ( à ) contre valeurs possibles pour la différence des deux indices.

Les autres exercices de ce chapitre Le cours du chapitre

Un blocage sur cet exercice ? Le tuteur d'Adloun guide par questions, sans donner la réponse.