08.07.2015 Views

TP : Listes en C - ENS Cachan

TP : Listes en C - ENS Cachan

TP : Listes en C - ENS Cachan

SHOW MORE
SHOW LESS

You also want an ePaper? Increase the reach of your titles

YUMPU automatically turns print PDFs into web optimized ePapers that Google loves.

<strong>TP</strong> : <strong>Listes</strong> <strong>en</strong> CChristophe Av<strong>en</strong>el Kévin Hugu<strong>en</strong>in Romain Tav<strong>en</strong>ardSeptembre 2009Préambule #1 : Gestion personnalisée des allocations/libérationsde mémoireIl est possible, <strong>en</strong> C, d’allouer de la mémoire <strong>en</strong> utilisant les fonctions malloc et realloc. La mémoireainsi allouée dans un programme se doit d’être libérée avant la fin de celui-ci, <strong>en</strong> utilisant free.Implém<strong>en</strong>tez les fonctions my malloc, my free et chk alloc qui, basées sur un compteur, permett<strong>en</strong>tde vérifier que le nombre de libérations de mémoire est égal au nombre d’allocations. Le principe seraalors de remplacer, dans votre code, tous vos appels à la fonction malloc (respectivem<strong>en</strong>t free) par desappels à votre fonction my malloc (respectivem<strong>en</strong>t my free) et de finir votre fonction main par un appelà chk alloc.Organisez vos fichiers afin que l’appel à ces fonctions depuis un fichier .c externe puisse se faire àpartir du mom<strong>en</strong>t où la ligne suivante est ajoutée à son <strong>en</strong>-tête :#include "alloc.h"Dans un fichier tp.c, vérifiez le fonctionnem<strong>en</strong>t des trois fonctions que vous v<strong>en</strong>ez d’écrire.Préambule #2 : MakefileLe but de ce <strong>TP</strong> est de vous faire programmer plusieurs petites APIs (Application ProgrammingInterfaces) et de vous les faire utiliser. Chacune de ces APIs sera constituée d’un couple fichier .c /fichier .h. À chaque modification du code d’une API, celle-ci devra être recompilée, ce qui peut êtrerelativem<strong>en</strong>t fastidieux quand on manipule un nombre élevé de fichiers. Pour cela, l’utilitaire make vouspermet de définir un <strong>en</strong>semble de commandes à exécuter pour compiler un projet.Par défaut, l’utilitaire make va lire le fichier Makefile du répertoire courant pour y trouver lescommandes à exécuter. Une brique de base d’un fichier Makefile se prés<strong>en</strong>te comme suit :cible: liste des fichiers nécessaires pour construire la cible séparés par des espacescommandes à exécuterPar exemple, pour compiler un fichier tp.c isolé, votre Makefile pourrait ressembler à :tp: tp.cgcc -o tp tp.cEt l’appel à make correspondant serait :make tpce qui signifie ”exécuter la liste de commandes précisée dans le fichier Makefile pour construire la cibletp”.Il est égalem<strong>en</strong>t possible de définir des variables utilisables à l’intérieur du Makefile. Pour la déclaration,la syntaxe est la suivante :MA_VARIABLE=sa_valeurPour faire appel à une variable déclarée, on utilise : $(MA VARIABLE).On déclare généralem<strong>en</strong>t (au moins) les variables suivantes <strong>en</strong> début de fichier Makefile :1


– CC : le compilateur à utiliser– CFLAGS : les flags à spécifier au compilateur (vous utiliserez -W -Wall -ansi -pedantic)– LDFLAGS : les flags à spécifier au linker (vous n’êtes pas obligé d’<strong>en</strong> spécifier pour l’instant)– EXEC : le nom de l’exécutable à générer– SRC : la liste de tous les fichiers .c à compiler– OBJ : la liste de tous les fichiers .o à linkerDans le cas de gros projets, énumérer la liste de tous les fichiers .c à compiler peut s’avérer fastidieux.Pour éviter cela, on peut désigner l’<strong>en</strong>semble des fichiers .c d’un répertoire avec :$(wildcard *.c)Ensuite, pour dire que l’<strong>en</strong>semble des fichiers .o à considérer correspond à la même liste que pour lesfichiers .c mais avec l’ext<strong>en</strong>sion .o, on écrit :OBJ= $(SRC:.c=.o)Enfin, pour dire que toute cible de la forme quelque chose.o doit être construite <strong>en</strong> se basant surle fichier quelque chose.c et <strong>en</strong> le compilant avec le programme spécifié par CC et les flags CFLAGS, onutilise la syntaxe :%.o: %.c$(CC) -o $@ -c $< $(CFLAGS)On voit ici apparaître des variables internes au Makefile. Les plus utiles sont les suivantes :– $@ : le nom de la cible– $< : le nom de la première dép<strong>en</strong>dance– $^ : la liste des dép<strong>en</strong>dancesÀ vous maint<strong>en</strong>ant de générer le fichier Makefile correspondant à vos besoins.1 <strong>Listes</strong> de taille bornéeVous allez comm<strong>en</strong>cer par définir un nouveau type permettant de stocker dans un tableau de taillefixe (cette taille étant la borne sur la taille de la liste) une liste d’<strong>en</strong>tiers. Vous utiliserez deux <strong>en</strong>tiers pourindiquer les index de début et de fin de liste (qui évolueront au fil des insertions/suppressions d’élém<strong>en</strong>tsdans la liste).Vous implém<strong>en</strong>terez les fonctions suivantes :– init– push– pop– printLes fonctions push et pop devront permettre à la liste d’être utilisée comme une file.2 <strong>Listes</strong> génériquesVous allez maint<strong>en</strong>ant définir un nouveau type permettant de manipuler des listes doublem<strong>en</strong>tchaînées d’<strong>en</strong>tiers. Vous utiliserez deux pointeurs pour indiquer, pour chaque élém<strong>en</strong>t, l’adresse del’élem<strong>en</strong>t précéd<strong>en</strong>t et celle du suivant.Vous implém<strong>en</strong>terez les fonctions suivantes :– init– push– popLes fonctions push et pop devront permettre à la liste d’être utilisée comme une pile.Modifiez votre code pour que le type des élém<strong>en</strong>ts de la liste ne soit pas imposé par l’API.2

Hooray! Your file is uploaded and ready to be published.

Saved successfully!

Ooh no, something went wrong!