Ce chapitre porte assez mal son nom puisque vous allez y trouver des notions que vous n'avez pas vues l'année dernière.
Gilles Bernard demande notamment une variante avec ifdef et #define, qui font appel à la notion de précompilation. Un exemple de ifdef est disponible dans le chapitre 1 de système d'exploitation p.102, puis un commentaire sur ce code p.104. ifdef signifie :“si cette variable est définie”. Il faut donc, pour exécuter la partie de code après ifdef, définir une variable, soit par un #define, soit avec gcc lors de la compilation avec l'option -Dnom_de_la_variable.
A partir de cette série d'exercices, il va beaucoup être question de mémoire, notamment avec l'utilisation répétée de malloc. Valgrind est un outil qui permet de faire le point sur l'utilisation de la mémoire par le programme. Ce n'est pas précisé dans le cours, mais il est préférable que la mémoire allouée soit ensuite libérée (à l'aide de la fonction free().
Téléchargement de Valgrind : https://www.valgrind.org/
Il y a un gros bug dans le code C fourni par le prof. Ce code est faux et plante à tout les coup:
list remplace(atom A, atom B, list L)
{ if ((car(L)) eql A)
{ car(L) = B ;
return remplace(A, B, cdr(L)) ;
}
if (L) return remplace(A, B, cdr(L)) ;
return NULL ;
}
En effet, lorsque l'on arrive à la fin de la liste, le cdr de L vas être NULL. Donc à l'itération suivante, on va tenter d'exécuter car(L)
c'est à dire NULL→car
et c'est le plantage assuré. Le code correcte (et qui suit le modèle en LISP) est:
list remplace(atom A, atom B, list L)
{ if (!L) return L;
if (car(L) eql A)
{ car(L) = B ;
return remplace(A, B, cdr(L)) ;
}
return remplace(A, B, cdr(L)) ;
}
L'exercice traitant des chaines de caractères, vous devrez probablement remplacer la ligne avec eql
par autre chose. Il n'y a aucune autre modification à faire.
La fin du chapitre II n'est pas dans le PDF mais encore dans l'ancien (ancien) format du cours, en HTML. L'archive se trouve sur Moodle mais vous trouverez une version PDF ici.
Le code donné dans le cours contient des erreurs (typos). Voici les principales erreurs (ce sont souvent les répétitions de la même erreur mais sur des pages différentes):
(or (answer (cdr (assoc (read-input) patterns :test match))) (return)) ) )
Il manque #'
devant match
match
, il manque une parenthèse fermanteprint-output
, il est écrit(cdr (output-pattern))
au lieu de
(cdr output-pattern)
match
, il manque une parenthèse fermanteprint-output
, il manque une parenthèse fermante et il est écrit:(cdr (output-pattern))
au lieu de
(cdr output-pattern)
print-with-joker
, il manque une parenthèse fermantematch
, il manque une parenthèse fermanteEn réponse à une question d'un élève, GB a indiqué: “La révision compte pour 3 points ; les 4 chapitres suivants valent 2 points chacun, et les 3 derniers 3 points. La note pour chaque chapitre dépend de la qualité du travail fait (intégrant le rapport de rendu d'exercice).”