Académique Documents
Professionnel Documents
Culture Documents
- p. 1/52
Erreurs courante en C
- p. 2/52
Le projet GNU
- p. 3/52
- p. 5/52
■ Exemple:
#define MAX(a, b) ((a) > (b) ? (a) : (b))
ex1.c ...
f=MAX(3,b);
- p. 6/52
Le compilateur cc1 ou gcc -S
Pointeur de fonctions
#include <stdio.h>
Erreurs courante en C
int main()
{
printf("Hello world\n");
return(0);
}
- p. 7/52
- p. 9/52
Éditeur de liens: ld
- p. 10/52
Manipuler les fichiers binaires
- p. 13/52
main: main.o
gcc main.o -o main
- p. 14/52
Makefile: définitions de variables
main: $(OBJ)
gcc -o main $(OBJ)
mv main $(TARGET_BIN)
■ la commande make main exécute:
gcc -o main main.o utils.o truc.o
mv main ../bin
- p. 15/52
- p. 16/52
Makefile: substitution et variables dynamique
- p. 17/52
- p. 18/52
Makefile: Exemple
CC =gcc
EXE =ex1 ex1.1 ex1.2 ex1.3 ex2.1 ex3.1
Outils pour la programmation
● GNU
● gcc
SRC=$(EXE:=.c)
● make OBJ=$(SRC:.c=.o)
● gdb
Introduction
all: $(EXE)
Pointeur de fonctions
Erreurs courante en C
tar: dummy
make clean
cd ..;tar -cvf TD1_corr.tar TD1/ex*.c TD1/test*.i
.SUFFIXES : .o .c
.c.o :
${CC} ${CFLAGS} -c $< -o $@
dummy:
clean:
-rm -f *~ *.out $(EXE) *.o
- p. 19/52
Makefile: Exemple
Résultat de l’exécution de la commande make
gcc ex1.1.c -o ex1.1
Outils pour la programmation gcc ex1.2.c -o ex1.2
● GNU
● gcc
gcc ex1.3.c -o ex1.3
● make
● gdb
gcc ex2.1.c -o ex2.1
Introduction
gcc ex3.1.c -o ex3.1
Pointeur de fonctions
Erreurs courante en C
- p. 20/52
gdb: GNU symbolic debugger
- p. 21/52
Introduction
i=1;
Pointeur de fonctions
p=(int *)malloc(sizeof(int));
Erreurs courante en C *p=2;
*p+=i;
fprintf(stdout,"i=%d, p=%X, *p=%d\n",i,p,*p);
free(p);
return(0);
}
■ compilation avec -g:
shell$ gcc -g exgdb.c -o exgdb
■ lancement de gdb: shell$ gdb exgdb
GNU gdb 6.3-debian
(gbd)
- p. 22/52
Exemple de session gdb
- p. 23/52
Pointeur de fonctions
■ p var est équivalent à print var
Erreurs courante en C
■ d var est équivalent à display var
■ s est équivalent à step
■ n est équivalent à next
■ c est équivalent à continue
■ La commande run peut prendre des arguments, le
programme est alors exécuté avec les arguments donnés
■ la commande info permet d’afficher des informations sur
l’état du programme dans le débugger. Par exemple info b
liste les points d’arrêt.
■ La commande help est l’aide en ligne de gdb
- p. 27/52
- p. 28/52
ddd: haut de la fenêtre
Introduction
Pointeur de fonctions
Erreurs courante en C
- p. 29/52
Introduction
Pointeur de fonctions
Erreurs courante en C
- p. 30/52
ddd: fenêtre de commande
Introduction
Pointeur de fonctions
Erreurs courante en C
- p. 31/52
ddd: breakpoint
Introduction
Pointeur de fonctions
Erreurs courante en C
- p. 32/52
ddd: display
Introduction
Pointeur de fonctions
Erreurs courante en C
- p. 33/52
Liens à connaître
- p. 34/52
Plan
- p. 35/52
- p. 36/52
Un premier exemple
int main()
{// declaration de pointeur de fonction
int (*foncPtr)(int a);
foncPtr=&fonct1;
(*foncPtr)(10);
return(0);
} - p. 37/52
- p. 38/52
Déclaration d’un pointeur de fonction
- p. 39/52
foncPtr=fonct1;
foncPtr(10);
- p. 40/52
On peut donc ecrire:
int main()
{// declaration de pointeur de fonction
int (*foncPtr)(int a);
foncPtr=fonct1;
foncPtr(10);
return(0);
} - p. 41/52
Un autre exemple
- p. 42/52
... la fonction tri
Outils pour la programmation ■ Comme pour une variable normale, on peut modifier un
Introduction
pointeur de fonction en le passant en paramêtre par
Pointeur de fonctions
référénce.
Erreurs courante en C
■ Pour avoir une fonction qui modifie un pointeur de fonction
(i.e. qui modifie la qui fonction appelée lorsque le pointeur
est invoqué), il faut que son paramêtre soit un pointeur sur
un pointeur de fonction.
- p. 44/52
Passage de fonction par référence
changeOrdre(int (**fcomp1)(int, int), int (*fcomp2)(int, int))
{
Outils pour la programmation
*fcomp1=fcomp2;
Introduction
}
Pointeur de fonctions
int main(void)
Erreurs courante en C
{
int i,t[6]={1,5,2,3,6,4};
int (*fcomp)(int,int);
fcomp=croissant;
trie(t, 6, fcomp);
for(i=0;i<6;i++)
fprintf(stdout," %d ",t[i]);
fprintf(stdout,"\n");
changeOrdre(&fcomp,decroissant);
trie(t, 6, fcomp);
for(i=0;i<6;i++) - p. 45/52
fprintf(stdout," %d ",t[i]);
Introduction
Pointeur de fonctions
Erreurs courante en C
- p. 46/52
Confusion entre == et =
- p. 47/52
- p. 48/52
Problèmes de macros
- p. 49/52
- p. 51/52
Erreurs courante en C
■ exemple de fichier configuration vi:
syntax on " coloration syntaxique
set autoindent " identation
set cindent " pour C
set nopaste
set ts=4 " tabulation a 4 caracteres
set sw=4
■ Sous vi:
◆ == pour indenter la ligne courante,
◆ =G pour identer tout le fichier:
- p. 52/52