Skip to topic | Skip to bottom
Home
Linfo
Linfo.CTPSurPointeursr1.2 - 07 Dec 2004 - 12:26 - OlivierDalletopic end

Start of topic | Skip to actions

L3O - TP3 : Pointeurs et Structures Chaînées

Débogueur symbolique GDB

(pour en savoir un peu plus man gdb ou encore un tour sur google ou autre)

  • Recopiez le fichier td03-essai-gdb.c.
  • Compilez-le avec l'option -g: il faut que la compilation ait été faite avec l'option -ggdb, afin que l'exécutable contienne des informations supplémentaires utilisées par le débogueur symbolique.
  • Exécutez-le par l'intermédiaire du débogueur gdb depuis emacs (Debugger... du menu Tools: gdb a.out).
  • Tapez "run".
  • Maintenant tapez "list" pour obtenir le numéro de ligne du for. Tapez "break no" (on a mis un point d'arrêt à l'instruction for de numéro no), puis "run" (ça commence l'exécution et s'arrête au point d'arrêt).
  • Tapez "print i" (cela permet d'imprimer la valeur de la variable i).
  • Tapez "step" (cela exécute la ligne suivante du programme pas à pas: si appel de fonction, on entre dans l'exécution pas à pas de la fonction), etc.
  • Tapez "next" (cela exécute la ligne suivante du programme: si appel de fonction, exécute l'appel sans en faire son exécution pas à pas) quand la flèche se trouve sur le write.
  • Tapez "print i" quand la flèche se trouve à l'intérieur de la définition de la fonction write. Quelle valeur peut-on obtenir?
  • Tapez "continue" quand on est sur le write.
  • ...

N'hésitez pas à utiliser l'aide: "help", "help break", "help where", ...

Pointeurs & structures chaînées

  1. Copiez le programme cambouis.c. Regardez-le avec attention. Compilez-le et exécutez-le. Une structure chaînée est totalement différente d'un tableau: regardez les différentes adresses!
  2. Listes

Un fichier de déclarations pour traiter le type liste pourrait être listes.h. Écrivez le fichier listes.c (Correction) correspondant: commencez par les fonctions les plus simples, et testez-les au fur et à mesure (Correction : Exemple de main et Makefile)

Vous remarquerez qu'il y a des paramètres de type pointeur sur fonction: par exemple, pour la procédure printList. Il suffira de définir dans le fichier principal, une procédure qui permet d'écrire sur la sortie standard un entier (puisqu'on se limite aux listes d'entiers pour le moment), et d'appeler printList avec comme paramètre effectif cette procédure.

Voici une solution avec élément supplémentaire dans la liste (élément "sentinelle").

Remarquez comment cet élément sentinelle permet de simplifier la signature des fonctions (plus besoin de paramètres de type Liste * ).

Exercice à finir (faire) pour la prochaine fois

(susceptible d'être noté ...)

On vous demande de faire un petit programme pour tester que vos fonctions de gestion de liste chaînée fonctionnent correctement. Et si ça n'est pas le cas, vous inciter à utiliser gdb pour trouver votre (vos) erreur(s)...

Il s'agit d'un programme de tri de mots fonctionnant selon le principe du tri par insertion : à chaque étape, un mot est lu sur l'entrée standard puis inséré dans la liste chaînée à la bonne position pour que la liste reste triée. Le programme se termine en affichant le contenu de la liste chaînée, lorsque l'entrée standard renvoie EOF (terminaison du programme par ). Pour chaque nouveau mot, il s'agit donc de :

  1. Créer une nouvelle cellule contenant le mot
  2. Insérer le mot dans la liste pour qu'elle soit (reste) triée dans l'odre alphabétique croissant
    1. Comparer le nouveau mot avec chacun des mots déjà présent dans la liste, en utilisant la fonction strcmp()
    2. Arrêter le parcours de la liste dès qu'un mot plus grand est trouvé
    3. Insérer (chaîner) la nouvelle cellule juste avant ce mot plus grand (ou en fin de liste)

Vous ferez aussi en sorte que votre programme puisse démarrer avec une liste de mots reçus en paramètre. Exemple de trace d'exécution du programme (appelé 'mon_tri' sur la machine 'petiote') :

petiote~> mon_tri une liste de "mots pour commencer"
quelques mots
lus sur stdin
^D
Voici le résultat du tri :
commencer
de
liste
lus
mots
mots
pour
quelques
stdin
sur
une
petiote~>

Indication : vous remarquerez qu'une ligne lue sur stdin (ou un paramètre si on utilise des guillemets) peut contenir plusieurs mots. Une façon de programmer la lecture de ces mots consiste à utiliser la fonction fscanf(), que vous commencez à bien connaître. Pour changer un peu, utilisez la fonction fgets() pour lire des lignes entières (attention, ne surtout pas utiliser gets(), car c'est une fonction dangeureuse, on vous expliquera pourquoi en TD) puis la fonction strtok() pour rechercher les mots dans la lignes lue (ou un argument argv[i]).

Correction :

  • adaptation de la solution de l'exercice précédent aux chaines : les seules choses qui changent sont le typedef au début du fichier listes.h et le main, qui manipule mainetnant des chaines au lieu d'entiers.
  • Il suffit de compiler avec ce nouveau main pour répondre à l'exercice (et avec ce Makefile)

(Un grand merci à Carine Fédèle à qui nous avons emprunté les premiers exercices de cette page).

-- OlivierDalle - 07 Dec 2004
to top

I Attachment sort Action Size Date Who Comment
td03-essai-gdb.c manage 0.2 K 07 Dec 2004 - 09:47 OlivierDalle  
cambouis.c manage 1.1 K 07 Dec 2004 - 09:49 OlivierDalle  
listes.h manage 1.7 K 07 Dec 2004 - 09:51 OlivierDalle  
listes.c manage 2.6 K 07 Dec 2004 - 09:51 OlivierDalle  
pal.c manage 1.6 K 07 Dec 2004 - 10:00 OlivierDalle  
Makefile manage 0.3 K 07 Dec 2004 - 10:01 OlivierDalle  
listes_s.c manage 2.1 K 07 Dec 2004 - 10:14 OlivierDalle  
listes_s.h manage 1.7 K 07 Dec 2004 - 10:14 OlivierDalle  
pal_s.c manage 1.6 K 07 Dec 2004 - 10:14 OlivierDalle  
Makefile_s manage 0.3 K 07 Dec 2004 - 10:15 OlivierDalle  
listes_ch.h manage 1.7 K 07 Dec 2004 - 12:16 OlivierDalle  
listes_ch.c manage 2.6 K 07 Dec 2004 - 12:16 OlivierDalle  
pal_ch.c manage 2.1 K 07 Dec 2004 - 12:17 OlivierDalle  
Makefile_ch manage 0.3 K 07 Dec 2004 - 13:11 OlivierDalle  
tri_ch.c manage 1.4 K 07 Dec 2004 - 13:27 OlivierDalle  

You are here: Linfo > CTPSurPointeurs

to top

Copyright © 1999-2017 by the contributing authors. All material on this collaboration platform is the property of the contributing authors.
Ideas, requests, problems regarding WIKIDeptinfo? Send feedback