1. Empiler (push), ajouter un élément sur la pile,
1. Empiler (push): ajouter un élément sur la pile.
2. Dépiler (pop), retirer l'élément du sommet de la pile et le retrouner,
2. Dépiler (pop): retirer l'élément du sommet de la pile et le retrouner.
3. Liste vide? (is_empty?)
3. Liste vide? (is_empty?).
. . .
. . .
4. Jeter un oeil (peek), retourner l'élément du sommet de la pile (sans le dépiler),
4. Jeter un oeil (peek): retourner l'élément du sommet de la pile (sans le dépiler).
5. Nombre d'éléments (length).
5. Nombre d'éléments (length).
## Comment faire les 4,5 à partir de 1 à 3?
## Comment faire les 4,5 à partir de 1 à 3?
...
@@ -310,7 +310,7 @@ void prises_devant(
...
@@ -310,7 +310,7 @@ void prises_devant(
. . .
. . .
4. Dépiler l'élément, le copier, puis l'empiler à nouveau.
4. Dépiler l'élément, le copier, puis l'empiler à nouveau.
5. Dépiler jusqu'à ce que la pile soit vide puis empiler à nouveau.
5. Dépiler jusqu'à ce que la pile soit vide, puis empiler à nouveau.
. . .
. . .
...
@@ -323,7 +323,7 @@ mémoire).
...
@@ -323,7 +323,7 @@ mémoire).
## Implémentation
## Implémentation
* Jusqu'ici on a pas du tout parlé d'implémentation (d'où le nom de structure
* Jusqu'ici on n'a pas du tout parlé d'implémentation (d'où le nom de structure
abstraite).
abstraite).
* Pas de choix unique d'implémentation.
* Pas de choix unique d'implémentation.
...
@@ -331,7 +331,7 @@ mémoire).
...
@@ -331,7 +331,7 @@ mémoire).
. . .
. . .
Et oui vous avez deviner: un tableau!
Et oui vous avez deviné: un tableau!
## La structure: de quoi avons-nous besoin (pile de taille fixe)?
## La structure: de quoi avons-nous besoin (pile de taille fixe)?
...
@@ -412,13 +412,13 @@ int stack_peek(stack *s) {
...
@@ -412,13 +412,13 @@ int stack_peek(stack *s) {
# Gestion d'erreur, level 0
# Gestion d'erreur, level 0
* Il y a plusieurs façon de traiter les erreur:
* Il y a plusieurs façon de traiter les erreur:
*Rien faire (laisser la responsabilité à l'utilisateur).
*Ne rien faire (laisser la responsabilité à l'utilisateur).
* Faire paniquer le programme (il plante plus ou moins violemment).
* Faire paniquer le programme (il plante plus ou moins violemment).
* Utiliser des codes d'erreurs.
* Utiliser des codes d'erreurs.
## La panique
## La panique
* En C on a les `assert()` pour faire paniquer un programme.
* En C, on a les `assert()` pour faire paniquer un programme.
# Assertions (1/3)
# Assertions (1/3)
...
@@ -433,7 +433,7 @@ void assert(int expression);
...
@@ -433,7 +433,7 @@ void assert(int expression);
- Macro permettant de tester une condition lors de l'exécution d'un programme:
- Macro permettant de tester une condition lors de l'exécution d'un programme:
- Si `expression == 0`{.C} (condition fausse), `assert()`{.C} affiche un message d'erreur sur `stderr`{.C} et termine l'exécution du programme.
- Si `expression == 0`{.C} (condition fausse), `assert()`{.C} affiche un message d'erreur sur `stderr`{.C} et termine l'exécution du programme.
- Sinon l'exécution se poursuit normalement.
- Sinon l'exécution se poursuit normalement.
- Peuvent être désactivés avec `-DNDEBUG` (équivalent à `#define
- Peuvent être désactivés à la compilation avec `-DNDEBUG` (équivalent à `#define
NDEBUG`)
NDEBUG`)
## À quoi ça sert?
## À quoi ça sert?
...
@@ -473,7 +473,7 @@ int stack_peek(stack *s) {
...
@@ -473,7 +473,7 @@ int stack_peek(stack *s) {
- Vérification de la validité des pointeurs (typiquement `!= NULL`{.C}).
- Vérification de la validité des pointeurs (typiquement `!= NULL`{.C}).
- Vérification du domaine des indices (dépassement de tableau).
- Vérification du domaine des indices (dépassement de tableau).
## Bug vs erreur de *runtime*
## Bug vs. erreur de *runtime*
- Les assertions sont là pour détecter les bugs (erreurs d'implémentation).
- Les assertions sont là pour détecter les bugs (erreurs d'implémentation).
- Les assertions ne sont pas là pour gérer les problèmes externes au programme (allocation mémoire qui échoue, mauvais paramètre d'entrée passé par l'utilisateur, ...).
- Les assertions ne sont pas là pour gérer les problèmes externes au programme (allocation mémoire qui échoue, mauvais paramètre d'entrée passé par l'utilisateur, ...).