Académique Documents
Professionnel Documents
Culture Documents
J.-F. Lalande
15 novembre 2012
Ce cours est mis disposition par Jean-Franois Lalande selon les termes de la licence
Creative Commons Attribution - Pas dUtilisation Commerciale - Partage lIdentique 3.0 non transpos.
Rsum
Ce cours tente de couvrir tous les aspects lis au dveloppement en langage C. Le cours dbute par ltude du
langage C en lui mme et se poursuit par ltude des aspects spcifiques des tableaux et pointeurs. Ensuite, lintro-
duction des structures combine la notion de pointeurs permet dtudier limplmentation de structures de donnes
complexes. Le cours termine par quelques lments priphriques (compilateur, ncurses, ...).
Livre de rfrence
Disponible la bibliothque :
Langage C, Claude DELANNOY, Eyrolles, 2005.
2 Langage 14
2.1 Entres/Sorties de base . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 14
2.2 Instructions de contrle . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 14
2.3 Fonctions . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 20
4 Notions avances du C 31
4.1 Structures dencapsulationes . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 31
4.2 Les variables . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 36
4.3 Prprocessing et compilation spare . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 38
4.4 Fichiers . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 40
4.5 Pointeurs de fonctions . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 44
1
Programmation C TABLE DES MATIRES
5 Divers 47
5.1 gcc . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 47
5.2 Ncurses . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 47
5.3 Oprations binaires . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 51
5.4 Cest tout cass, ca marche pas . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 53
CPL : 1960, conu par les universits de Cambridge : trop complexe, personne Les anctres, extrait de [7]
na pu crire de compilateur...
C a trois anctres : les langages CPL, BCPL et B.
BCPL : Basic CPL, crit par Martin Richards (Cambridge) : langage proche CPL : 1960, conu par les universits de Cambridge : trop
complexe, personne na pu crire de compilateur...
du mot machine BCPL : Basic CPL, crit par Martin Richards (Cambridge) :
langage proche du mot machine
B : Ken Thompson, 1970 Belle et AT&T : simplification du BCPL aprs avoir B : Ken Thompson, 1970 Belle et AT&T : simplification du BCPL
aprs avoir crit un UNIX en assembleur
crit un UNIX en assembleur C : dvelopp par Dennis Ritchie en 72 : une sorte de nouveau B
avec en plus les tableaux, les pointeurs, les nombres virgule
C : dvelopp par Dennis Ritchie en 72 : une sorte de nouveau B avec en plus flottante, les structures...
En 1973, C fut suffisamment au point pour que 90% de UNIX puisse
les tableaux, les pointeurs, les nombres virgule flottante, les structures... tre rcrit avec. En 1974, les laboratoires Bell ont accord des licences
UNIX aux universits et cest ainsi que C a commenc tre distribu.
En 1973, C fut suffisamment au point pour que 90% de UNIX puisse tre rcrit J.-F. Lalande Programmation C 7/204
avec. En 1974, les laboratoires Bell ont accord des licences UNIX aux universits
et cest ainsi que C a commenc tre distribu.
malise en 1978 lorsque Brian Kernighan et Dennis Ritchie ont publi la pre- Historique, extrait de [7] I
mire dition du livre The C Programming Language. Ce livre dcrit ce quon
appelle actuellement le K&R C, C traditionnel, voire vieux C. Peu aprs sa 1978 - K&R C : La plus ancienne version de C encore en usage a
t formalise en 1978 lorsque Brian Kernighan et Dennis Ritchie
publication, de trs nombreux compilateurs C ont commenc apparatre. ont publi la premire dition du livre The C Programming
Language. Ce livre dcrit ce quon appelle actuellement le K&R C,
1983 - C++ : A partir de 1980, Bjarne Stroustrup a tendu C avec le concept C traditionnel, voire vieux C. Peu aprs sa publication, de trs
nombreux compilateurs C ont commenc apparatre.
1983 - C++ : A partir de 1980, Bjarne Stroustrup a tendu C avec
de classe. Ce langage tendu a dabord t appel C with Classes, puis C++ le concept de classe. Ce langage tendu a dabord t appel C
with Classes, puis C++ en 1983.
en 1983. 1983 - Objective C : Objective C a t cr par Brad Cox. Ce
langage est un strict sur-ensemble de C. Il lui apporte un support
1983 - Objective C : Objective C a t cr par Brad Cox. Ce langage est de la programmation oriente objet inspir de Smalltalk.
un strict sur-ensemble de C. Il lui apporte un support de la programmation J.-F. Lalande Programmation C 8/204
printf("Hello world!\n"); 5
return 0; 6
} 7
Premiers principes
Lalphabet du C
J.-F. Lalande Programmation C 11/204
tain nombre de symboles de ponctuation. Cela permet dviter un certain nombre Lalphabet du C
de problmes, notamment lors de la transmission de programmes (Telex !, e-mail,
etc...). Lalphabet du C est bas sur la langue anglaise laquelle on ajoute un
certain nombre de symboles de ponctuation. Cela permet dviter un
certain nombre de problmes, notamment lors de la transmission de
programmes (Telex !, e-mail, etc...).
Listing 2 Alphabet issu de [?] Listing 2 Alphabet issu de [3]
a b c d e f g h i j k l m n o p q r s t u v w x y z
a b c d e f g h i j k l m n o p q r s t u v w x y z 1 A B C D E F G H I J K
0 1 2 3 4 5 6 7 8 9
L M N O P Q R S T U VWX Y Z
! " # % & ( ) + , . / 4
: ; < = > ? [ \ ] ^ _ { | } ~ 5 J.-F. Lalande Programmation C 12/204
Compilation
Compilation (2)
Compilation (2)
gcc -o prog fichier.o
non ISO C), Warnings activs Options courantes : norme ANSI (respecte ISO C), pedantic (rejet des
extensions non ISO C), Warnings activs
gcc -Wall -ansi -pedantic foo.c
gcc -Wall -ansi -pedantic foo.c Excution du fichier prog :
./prog
./prog
Compilation
Cest la fois :
Introduction Types et variables
Un espace dans la mmoire ou de linformation est stocke Variables : quest ce que cest ?
Un identifiant (label) dans le code source pour manipuler cette donne
Cest la fois :
Un espace dans la mmoire ou de linformation est stocke
int a; 1 Un identifiant (label) dans le code source pour manipuler cette
int b = 0; 2 donne
type label;
type label = constante;
Identifiants de variables
temperature = 12; 4
nom_de_l_objet = r; 5
Le compilateur sappuie sur les espaces blancs pour sparer les mots du langage,
Introduction Types et variables
des variables, sauf lorsquun sparateur (, ; { etc...) indique la dlimitation. Ainsi : La gestion des espaces blancs et le format libre
intx,y; // Impossible parser 1 Le compilateur sappuie sur les espaces blancs pour sparer les mots
du langage, des variables, sauf lorsquun sparateur (, ; { etc...)
int x,y; // ok 2 indique la dlimitation. Ainsi :
int x,y,z; // ok 3 intx,y; // Impossible parser
int x,y; // ok
int x, y, z; // ok 4 int x,y,z; // ok
int x, y, z; // ok
y; // Pas ok
, 2
y; // ok 3
int x 4
y; // Pas ok 5
Printf
Cela savre notamment trs utile pour jouer avec les variables... Printf
Permet dimprimer lcran
Linstruction printf permet denvoyer des caractres sur la sortie
Imprime du texte ou des code de format standard. Cela savre notamment trs utile pour jouer avec les
variables...
Texte : "Hello world ! \n" Permet dimprimer lcran
Imprime du texte ou des code de format
Code de format commencant par % Texte : "Hello world ! \n"
Code de format commencant par %
int x = 0; 1 int x = 0;
printf("Affichage de texte\n");
Printf (2)
Les entiers
Les entiers :
Entier court sign : short, short int, signed short, signed
Introduction Types et variables
Les entiers
short int : -32 767 32 767
Entier sign : int, signed int Les entiers :
Entier court sign : short, short int, signed short,
Entier long sign : long, long int, signed long : 0 4 294 967 295 signed short int : -32 767 32 767
Entier sign : int, signed int
Toutes combinaison de (un)signed~(short)~type Entier long sign : long, long int, signed long : 0 4 294
967 295
Exemples : Toutes combinaison de (un)signed~(short)~type
Exemples :
int a; int b=3;
int a; int b=3; 1 unsigned long int u;
signed short int w = 2;
unsigned long int u; 2
signed short int w = 2; 3 J.-F. Lalande Programmation C 21/204
Les flottants
int main() { 2
float x = 0.1; 3 Consquence de cette approximation :
#include <stdio.h>
printf("x avec 1 decimale: %.1e\n", x); 4 int main() {
float x = 0.1;
printf("x avec 1 decimale: %.10e\n", x); 5 printf("x avec 1 decimale: %.1e\n", x);
printf("x avec 1 decimale: %.10e\n", x);
return 0; 6 }
return 0;
} 7 ce qui donne :
jf@lalande:cours/prog> ./prog
x avec 1 decimale: 1.0e-01
x avec 1 decimale: 1.0000000149e-01
ce qui donne :
jf@lalande:cours/prog> ./prog
J.-F. Lalande Programmation C 23/204
Comparaisons difficiles !
float x = 0.1; 1
Non respect des rgles de lalgbre :
float y = 0.2; 2 float x = 0.1;
3x == 0.3 // Vrai ou faux ! 3 float y = 0.2;
3x == 0.3 // Vrai ou faux !
x + y == 0.2 // Vrai ou faux ! 4 x + y == 0.2 // Vrai ou faux !
float x = 0.1; 1
float y = 0.2; 2 J.-F. Lalande Programmation C 24/204
Les constantes
i entier
f flottant
l long
c caractre
tc tableau de caractres.
en les initialisant de la manire suivante :
i la valeur hexadcimale 50 ;
f 3.14 ;
l la valeur octale 40 ;
c z;
tc qwertyuiop.
float 32 bits 32 bits 32 bits 32 bits 32 bits J.-F. Lalande Programmation C 26/204
Un caractre (char) est cod sur un domaine numrique de 256. (sign, de -127
Introduction Types et variables
127, non sign de 0 255). Il y a donc peu de caractres disponibles, ce qui explique Les caractres
pourquoi les caractre nationaux peuvent ne pas tre reprsents suivant le systme
Un caractre (char) est cod sur un domaine numrique de 256.
o lon compile : (sign, de -127 127, non sign de 0 255). Il y a donc peu de
caractres disponibles, ce qui explique pourquoi les caractre
nationaux peuvent ne pas tre reprsents suivant le systme o lon
compile :
6 jf@radotte:~$ ./prog
printf("%c\n", c2); 7
a
8
return 0; 9 ?
} 10
Certains caractres non imprimables peuvent tre reprsents par une convention
Introduction Types et variables
lanti-slash \.
#include <stdio.h>
int main(void) {
int choix = 4;
#include <stdio.h> 1 printf("Choix numro %i \n", choix);
return 0; // destruction de choix
2 }
int main(void) { 3
int choix = 4; 4 J.-F. Lalande Programmation C 29/204
Porte temporelle
Une variable nexiste qu partir dun instant donn (sa dclaration) et jusqu
Introduction Types et variables
un instant donn de la vie du programme (par exemple, la fin du programme). Porte temporelle
Contre exemple :
Une variable nexiste qu partir dun instant donn (sa dclaration) et
jusqu un instant donn de la vie du programme (par exemple, la fin
du programme).
int main(void)
{
printf("Choix numro %i \n", choix); // Impossible !
int choix = 4;
return 0;
}
#include <stdio.h> 1
2
int main(void) 3
{ 4
printf("Choix numro %i \n", choix); // Impossible ! 5
int choix = 4; 6
return 0; 7
} 8
Porte spatiale
Une variable nexiste que dans la porte spatiale courante et dans les "sous
Introduction Types et variables
Une variable nexiste que dans la porte spatiale courante et dans les
"sous portes spatiales" incluses.
#include <stdio.h>
int main(void)
{
int a = 8;
{
int choix = 4;
printf("Choix numro %i et %i \n", choix, a); // Possible !
} // destruction de a
printf("Choix numro %i et %i \n", choix, a); // Impossible !
return 0;
}
2
int main(void) 3
{ 4
int a = 8; 5
{ 6
int choix = 4; 7
printf("Choix numro %i et %i \n", choix, a); // Possible ! 8
} // destruction de a 9
printf("Choix numro %i et %i \n", choix, a); // Impossible ! 10
return 0; 11
} 12
Affectation
une case mmoire un instant donn du programme (au moment de lexcution de Affectation
laffectation).
Laffectation dune variable permet de raliser le stockage dune valeur
dans une case mmoire un instant donn du programme (au
moment de lexcution de laffectation).
a = 45;
Modification de la valeur stocke dans a
Il ne sagit pas dune assertion mathmatique 45 = a;
Linstruction est :
Temporelle (se produit linstant de lexcution)
Temporaire (peut-tre chang plus tard)
a = b = 12; est possible
a = 45;
J.-F. Lalande Programmation C 32/204
Modification de la valeur stocke dans a
Il ne sagit pas dune assertion mathmatique 45 = a;
Linstruction est :
Temporelle (se produit linstant de lexcution)
Temporaire (peut-tre chang plus tard)
a = b = 12; est possible
Conversion implicite
Une conversion implicite a lieu lorsque le programme doit appliquer une opra- Conversion implicite
tion sur deux oprandes de types diffrents.
Une conversion implicite a lieu lorsque le programme doit appliquer
une opration sur deux oprandes de types diffrents.
Exemple de conversion :
#include <stdio.h>
Rgle :
Exemple de conversion : 1 Convertir les lments de la partie droite de laffectation dans le
type le plus riche.
2 Faire les calculs
#include <stdio.h> 1 3 Convertir dans le type de la variable de gauche
2 J.-F. Lalande Programmation C 33/204
Rgle :
1. Convertir les lments de la partie droite de laffectation dans le type le plus
riche.
2. Faire les calculs
3. Convertir dans le type de la variable de gauche
Exercice 4 Testez la conversion implicite dun float en int.
Il est plus prudent de toujours "caster" ses variables. On exprime alors explicite-
Introduction Types et variables
ment les conversions ncessaires laide loprateur "()" : Conversion explicite : le cast
On prcise explicitement les variables/expressions convertir
Il est plus prudent de toujours "caster" ses variables. On exprime alors
On vite les erreurs de calcul explicitement les conversions ncessaires laide loprateur "()" :
On prcise explicitement les variables/expressions convertir
Notation : On vite les erreurs de calcul
(type)variable Notation :
(type)variable
Dclaration et dfinition
#include <stdio.h> 1 jf@linotte:~/swap> gcc -o truc truc.c #include <stdio.h> jf@linotte:~/swap> gcc -o truc
int main(void) { 2 jf@linotte:~/swap> ./truc
int main(void) {
int a;
truc.c
jf@linotte:~/swap> ./truc
int a; 3 printf("%i",a); -1208587072%
-1208587072% return 0; }
printf("%i",a); 4
return 0; } 5
J.-F. Lalande Programmation C 35/204
1.4 Oprateurs
Oprateurs
Introduction Oprateurs
daffectation : = dincrmentation : ++ --
conditionnel ternaire : foo = x >= 0 ? x : -x;
daffectation compose : += -= /= *= %= de conversion de type
Effet de bord
bar = foo = 2;
foo = ++bar : effet de bord, affectation foo = bar++ : affectation, effet de bord
Exercice 13 Vrifiez dans un programme test linfluence de la position de loprateur ++ sur le nom de lidentifiant.
Exercice 14 Quand linstruction conditionnelle if aura t vue, crivez un test qui vrifie lgalit entre une variable
et une valeur. Insrez dans ce test un ++ et vrifiez linfluence de sa place. Que pensez-vous de cela ?
Constantes boolennes
Le VRAI et FAUX en C :
Introduction Oprateurs
Exercice 15 Promettez doffrir un caf votre voisin chaque fois o vous ferez cette erreur.
J.-F. Lalande Programmation C 38/204
Si expr2 est fausse, alors retourner FAUX sinon retourner VRAI Si expr1 est fausse, alors retourner FAUX
Si expr1 est vraie alors expr2 est value
Si expr2 est fausse, alors retourner FAUX sinon retourner VRAI
expr1 || expr2 expr || expr 1 2
Si expr1 est VRAI, alors retourner VRAI
Si expr1 est VRAI, alors retourner VRAI Si expr2 est VRAI, alors retourner VRAI
Retourner FAUX
Exercice 16 Lorsque vous aurez vu en algorithmique les structures conditionnelles et itratives, crire en pseudo-
langage algorithmique les algorithmes qui permettent dvaluer :
expr1 && expr2 && . . . && exprn
expr1 || expr2 || . . . || exprn
Syntaxe de printf :
printf(format, liste_expressions)
Langage Entres/Sorties de base
printf, scanf
format : chaine de caractres entr " "
liste_expresions : variables utiliser Syntaxe de printf :
printf(format, liste_expressions)
Exemple : format : chaine de caractres entr " "
liste_expresions : variables utiliser
Exemple :
printf("energie : %f\n", e) 1 printf("energie : %f\n", e)
Renvoie :
Le nombre de caractres crits
Une valeur ngative en cas derreur
Renvoie :
Le nombre de caractres crits J.-F. Lalande Programmation C 41/204
Format du scanf
%d entier dcimal
%f flottant
Langage Entres/Sorties de base
Format du scanf
%f double
%c caractre (1 seul) %d entier dcimal
%s chane de caractres %f flottant
%f double
Lire au clavier : %c caractre (1 seul)
%s chane de caractres
Exercice 18 Demandez lutilisateur de rentrer les valeurs a et b de lexercice prcdent au clavier, avant de les
afficher.
if (condition) 1 Conditionnelle
{ 2
// Instructions si condition vraie 3 Conditionnelle par bloc :
if (condition)
} 4 {
// Instructions si condition vraie
else // Optionnel 5 }
else // Optionnel
{ 6 {
// Instructions si condition fausse
}
// Instructions si condition fausse 7
Conditionnelle rapide :
} 8 if (condition)
// 1 seule instruction
if (condition) 1
// 1 seule instruction 2
Exemples :
Exemples : Exemples :
if (a == 5) 1
b = 12; 2 Exemples :
if (a > 5) 3 if (a == 5)
b = 12;
b = 13; 4 if (a > 5)
b = 13;
if (a > 5 || a < 0) 5 if (a > 5 || a < 0)
{
printf("condition runnie !");
{ 6 c = 12;
c = 12; 8
} 9 J.-F. Lalande Programmation C 44/204
Exercice 19 crire un programme qui permet de dterminer si un nombre entre 1 et 10 est pair, puis sil est premier
( laide de tests).
Exercice 20 crire un programme qui permet dafficher lcran, dans lordre, trois entiers a, b et c.
Imbrications de conditionnelles
if(expression) 2
statement; 3 Limbrication de conditionnellles "rapides" peut tre dangereux :
if(expression)
if(expression)
statement;
Branchement
case value1 : 2
inst 10; 3 Branchement selon la valeur dune variable :
switch (variable) {
inst 12; 4 case value1 :
inst 10;
break; 5 inst 12;
break;
case value2 : 6 case value2 :
inst 20;
default: 10
inst d1; 11 J.-F. Lalande Programmation C 46/204
inst d2; 12
break; } 13
Exercice 21 crire un programme qui imprime le type de lettre (voyelle ou consonne) entre au clavier.
Itrations : POUR
for (initialisation ; condition de continuation ; instruction de boucle) 1 Syntaxe du for par bloc :
for (initialisation ; condition de continuation ; instruction de boucle)
{ 2 {
// Instructions
}
// Instructions 3
for rapide :
} 4
for (initialisation ; condition de continuation ; instruction de boucle)
// 1 seule instruction
Exemples :
2 Exemples :
// Boucle itrative de 1 15 3
for (i = 0; i <= 15; i++} 4
int i,j,k;
{ 5
// Boucle itrative de 1 15
printf("Ligne %i !", i); 6 for (i = 0; i <= 15; i++}
{
} 7 }
printf("Ligne %i !", i);
Exemples (2) :
2 Exemples (2) :
i = 1; 3
for ( ; i <= 15; i++} 4
printf("Ligne %i !", i); 5 int i,j,k;
i = 1;
6 for ( ; i <= 15; i++}
printf("Ligne %i !", i);
for (j = 6; j > 20; ) 7
for (j = 6; j > 20; )
printf("Ligne %i !", j); 8 printf("Ligne %i !", j);
Exemples (3) :
Exemples (3) :
float x; int i; 1
// Dangereux ! 2
for (x=0; x<1.0; x+=0.1) 3 Le for suivant est dangereux :
while rapide :
while (condition)
while rapide : // 1 seule instruction
// 1 seule instruction 2
Exemples :
Exemples :
Langage Instructions de contrle
2
i = 1; 3 Exemples :
7 j = 6;
while (j > 20) {
j = 6; 8 i = i + j;
j = j 2;; }
while (j > 20) { 9
i = i + j; 10
j = j 2;; } 11 J.-F. Lalande Programmation C 52/204
Itrations : FAIRE
Itrations : FAIRE
do 1
FAIRE ... JUSQUA ...
{ 2
Syntaxe du do ... while :
// Instructions 3 do
{
} 4 // Instructions
}
while (condition); 5 while (condition);
// 1 seule instruction 2
while (condition); 3
Problmes frquents
Rupture de squence
return ; ou return X ; // sort de la fonction courante en renvoyant le rsultat X Ce slide doit tre OUBLI la fin du cours !
Exemple :
2 Exemple :
int main (int argc, char argv[]) { 3
int i, j, c; 4 #include "stdio.h"
for (i = j = 0; (c = getchar ()) != EOF; i++) { 5 int main (int argc, char argv[]) {
if (c == r) 6 int i, j, c;
for (i = j = 0; (c = getchar ()) != EOF; i++) {
if (c == r)
break; 7 break;
if (c == )
if (c == ) 8 continue;
j++;
continue; 9 }
printf ("Caracteres lus : %d dont non blancs %d\n", i, j);
j++; 10 return 0; }
return 0; } 13
for ( ; ; ; ) 1
Boucles dapparence infinie :
{ 2
for ( ; ; ; )
// Instructions contenant un moment 3 {
// Instructions contenant un moment
// un break 4 }
// un break
} 5 while (1)
{
6 // Instructions contenant un moment
// un break
while (1) 7 }
{ 8
// Instructions contenant un moment 9 J.-F. Lalande Programmation C 57/204
// un break 10
} 11
Programmation structure
Pourquoi et o ?
int ma_fonction()
int main()
{ ... } 2 { ... }
int main() 4
{ ... } 5
Retour de la fonction
Si des instructions sont conscutives un return, elles ne seront jamais excutes. Si pas dinstruction de retour, on
peut appeler cette fonction une "procdure".
Exercice 30 crire une fonction prenant un entier et un double en paramtre. Cette fonction fait la somme et renvoie
le rsultat.
Exercice 31 crire une fonction qui prend trois entiers en paramtres et affiche lcran le plus grand et le plus petit.
Exercice 32 Ecrire une fonction qui calcule n! et renvoie le rsultat.
P
Exercice 33 Ecrire une fonction qui cacule k tel que i<k i et renvoie le rsultat.
Appels de fonctions
Langage Fonctions
Exemples
Dclaration de fonctions
int main(void) { 4
int choix = 4; 5
printf("Choix numro %i \n", choix); 6
ma_fonction(); 7
return 0; 8
} 9
10
void ma_fonction() { 11
printf("Choix numro %i\n", choix); 12
} 13
Rcursivit
Il est tout fait possible dappeler depuis une fonction cette mme fonction. On
Langage Fonctions
Il est tout fait possible dappeler depuis une fonction cette mme
fonction. On appelle cela un appel rcursif.
return nfac(n1); 6
} 7
Dailleurs vous utilisez courrament une fonction argument variables... Fonctions arguments variables
Les arguments variables sont reprsents par ...
Les arguments sont stocks dans une sorte de liste La norme ANSI autorise lutilisation de fonctions arguments
variables. Dailleurs vous utilisez courrament une fonction argument
La rcupration de ces variables se fait laide des fonctions : variables...
Les arguments variables sont reprsents par ...
Les arguments sont stocks dans une sorte de liste
#include <stdarg.h> 1 La rcupration de ces variables se fait laide des fonctions :
void va_start(va_list ap, nom_derniere_variable_nommee); 2 #include <stdarg.h>
va_list liste; 1
La premire tape consiste crer une variable de type va_list.
va_list liste;
La deuxime tape sappuie suir lappel va_start : lappel initialise la liste La deuxime tape sappuie suir lappel va_start : lappel initialise
la liste et la positionne afin de prparer la premire variable qui suit la
et la positionne afin de prparer la premire variable qui suit la dernire variable dernire variable nomme
Ensuite, chaque appel va_arg permet de rcuprer la valeur de la
nomme variable courante. De plus, lappel dcale le pointeur de liste sur le
prochain lment.
Ensuite, chaque appel va_arg permet de rcuprer la valeur de la variable Enfin va_end termine la liste et nettoie la mmoire avant le retour la
fonction appelante.
fonc_arg_var(3,100,7,8,9); 13
fonc_arg_var(1,5,9); 14
return 0; 15
} 16
Un tableau permet de stocker plusieurs valeurs de mme type dans des cases
Les tableaux et pointeurs Tableaux
Ou initialisation directe :
int tableau[256] = {12,142,12,2,48};
int tableau[] = {12,142,12,2,48};
Ou initialisation directe :
J.-F. Lalande Programmation C 76/204
double t[10]; 1
sizeof(t) // Taille de t en octets 2
(sizeof)t // Idem, alternative de notation 3
10 sizeof(double) // 10 fois taille double 4
sizeof(double[10]) // Taille tableau de double 5
10 sizeof(t[0]) // 10 fois taille 1er elment 6
Tableaux static
Tableaux static
t[ici] = a_stocker; 3 }
} 4
J.-F. Lalande Programmation C 79/204
Tableaux const
ma_fonction(t); } 6 ./prog
zsh: segmentation fault ./prog
./prog 1
zsh: segmentation fault ./prog 2
Tableaux multidimensionels
int t_d[2][3];
Ce qui donne, au niveau mmoire (figure issue de [?]) : Ce qui donne, au niveau mmoire (figure issue de [3]) :
Tableaux dynamiques
La dclaration de tableaux dont la taille est inconnue est interdite ! Par exemple, Tableaux dynamiques
on ne peut faire :
La dclaration de tableaux dont la taille est inconnue est interdite ! Par
int j = 5; 1 exemple, on ne peut faire :
La notion dadresse dune case mmoire La notion dadresse dune case mmoire
La notion de pointeur (contient une adresse)
La notion de pointeur (contient une adresse)
J.-F. Lalande Programmation C 83/204
Adresse et pointeur
Adresse et pointeur I
int variable; 1
scanf("%i", &variable); 2
printf("addresse de variable: %i \n", &variable); 3 Adresse dune variable :
printf("contenu de variable: %i \n", variable); 4 int variable;
scanf("%i", &variable);
printf("addresse de variable: %i \n", &variable);
printf("contenu de variable: %i \n", variable);
int variable; 1
int p; 2
p = &variable; 3
printf("addresse de variable: %i \n", p); 4
printf("contenu de variable: %i \n", p); 5
Ne pas confondre :
La signification du &
La signification du *
Et saider de petits dessins loccasion !
Exercice 34 Crez un pointeur p sur un float et un float f. Enregistrez 12.3 dans f et faites pointer p sur ce flottant.
Exercice 35 Crez un pointeur q sur un float. Initialisez directement la valeur pointe par q avec 45.5. Crez un
pointeur r et faites le pointer sur la mme valeur que q.
Exercice 36 Crez deux pointeurs et faites les pointer sur deux entiers. Echangez alors les valeurs points.
Passage de paramtre par adresse ou par pointeur Retour sur les fonctions
Retour de fonction : adresse ou pointeur
Utilisation dans les fonctions :
int main() { 1 Passage de paramtre par adresse ou par pointeur
param = 45; 7
} 8 J.-F. Lalande Programmation C 87/204
Exercice 37 Codez une fonction au_carre qui prend un pointeur sur un entier en paramtre et le passe au carr.
Exercice 38 Codez une fonction echange qui permet de prendre deux pointeurs en paramtre et qui change le
pointage vers ces deux entiers.
Exercice 39 Codez une fonction initialise ne prenant pas de paramtre et renvoyant un pointeur sur un entier.
est en fait la dclaration dun pointeur vers le premier lment Retour sur les tableaux I
rserve lespace n lments conscutifs
permet de "pointer" sur le kme lment La dclaration dun tableau :
est en fait la dclaration dun pointeur vers le premier lment
Pointer sur llment 0 ou 5 : rserve lespace n lments conscutifs
permet de "pointer" sur le kme lment
int p5 = &tableau[5]; 4
J.-F. Lalande Programmation C 88/204
Fonctions et sizeof
Preuve :
#include <stdio.h> 1
void ma_fonction(int t) { 2
int nb = sizeof(t) / sizeof(t[0]); 3
printf("nb=%i\n", nb); } 4
int main() { 5
double t[10]; 6
int nb = sizeof(t) / sizeof(t[0]); 7
printf("nb=%i\n", nb); 8
ma_fonction(t); } 9
./prog
nb=10
nb=1
1
printf("%s\n", chaine); // affiche "coucou ceci" 2
Allocation de la mmoire :
Les tableaux et pointeurs Lallocation dynamique
int fonction() 1 }
int i; int j; // Allocation dynamique
{ 2
int i; int j; // Allocation dynamique 3 J.-F. Lalande Programmation C 96/204
} 4
Allocation de variable :
Les tableaux et pointeurs Lallocation dynamique
// liberation de lespace mmoire allou 3 // Allocation dun entier et dun pointeur vers lentier
int x = (int) malloc(sizeof(int));
free(x); 4 // liberation de lespace mmoire allou
free(x);
printf("truc=%s\n", truc); 13
printf("machin=%s\n", machin); 14
free(truc); // segmentation fault 15
free(machin); 16
return 0; 17
} 18
}; 8 Utilisation :
struct nom_de_structure variable;
Exemple :
struct animal { 1
char nom[50]; 2
int age; 3
float taille; }; 4
Struct imbriqus
grande_poupee.interieur = &petite_poupee; 3
petite_poupee.interieur = NULL; 4
J.-F. Lalande Programmation C 103/204
Typedef
Exemple :
struct animal {
char nom[50];
int age;
float taille; };
J.-F. Lalande 31/56 typedef struct animal poisson;
poisson bar = {"Bar", 12, 7.5};
Ensi de Bourges
J.-F. Lalande Programmation C 104/204
Programmation C 4.1 Structures dencapsulationes
Exemple :
struct animal { 1
char nom[50]; 2
int age; 3
float taille; }; 4
typedef struct animal poisson; 5
poisson bar = {"Bar", 12, 7.5}; 6
bar>taille = 5; 3
J.-F. Lalande Programmation C 106/204
int age; }; 5
typedef struct animal poisson; 6 J.-F. Lalande Programmation C 107/204
poisson p; 10
} noeud;
J.-F. Lalande Programmation C 111/204
11
12
// Instanciation 13
int main() { 14
noeud premier, deuxieme, troisieme; 15
poisson bar = (poisson ) malloc(sizeof(poisson)); 16
bar>age = 5; 17
premier = (noeud ) malloc(sizeof(noeud)); 18
deuxieme = (noeud ) malloc(sizeof(noeud)); 19
troisieme = (noeud ) malloc(sizeof(noeud)); 20
premier>p = bar; // A faire dans les autres noeuds 21
premier>gauche = deuxieme; 22
//premier>droite = deuxieme; // hrsie !! 23
premier>droite = troisieme; 24
} 25
} pile; 11
12
// Instanciation 13
int main() { 14
pile ma_pile = (pile )malloc(sizeof(pile)); 15
ma_pile>taille_max = 256; 16
ma_pile>p = (poisson )calloc(256, sizeof(poisson)); 17
poisson bar = (poisson ) malloc(sizeof(poisson)); 18
bar>age = 5; 19
//(ma_pile>p+ma_pile>courant) = bar; // Ne marche pas 20
(ma_pile>p+ma_pile>courant++) = bar; // Copie du bar dans le tableau 21
} 22
Le graphe de poissons :
Notions avances du C Structures dencapsulationes
Matrice dentiers
Union
Union I
Utilisation :
Programmation C 4.2 Les variables
Peut contenir diffrents types
Mais une seule valeur la fois
union nom_de_union { 1
type1 nom_champ1 ; 2
type2 nom_champ2 ; 3
... 4
typeN nom_champ_N ; 5
}; 6
Utilisation :
union nom_de_structure variable; 1
Exemple dunion :
union number // Peut contenir 3 types 1
{ 2
short shortnumber; 3
long longnumber; 4
float floatnumber; 5
} anumber; 6
anumber.longnumer = 45; // considre anumber comme long 7
anumber.floatnumer = 45.4; // considre anumber comme float 8
numration
Type numr :
Notions avances du C Structures dencapsulationes
Exemple dutilisation :
#include <stdio.h> 1
enum days {mon, tues, sun}; 2
3
int main() { 4
enum days d = mon; 5
printf("d=%i\n", d); 6
d= tues; 7
printf("d=%i\n", d); } 8
./prog 1
d=0 2
d=1 3
extern int a, b;
extern int n = 3; 2
Dclaration avec initialisation : dfinition
int n = 3;
extern int n = 3;
Dclaration avec extern sans initialisation : redclaration Dclaration avec extern sans initialisation : redclaration
int a = 3; / dfinition /
extern int a; / redclaration de a rfrence la dfinition / 3 extern int a; / redclaration de a: soit dans ce fichier soit aiilleurs /
...
... 4 int a = 3; / dfinition de a /
int auto_var = 0; 10
void stat(); / prototype fn / 1 static int static_var = 0; 11
2 printf( "auto = %d, static = %d\n", auto_var, static_var); 12
main() 3 ++auto_var; 13
{ int i; 4 ++static_var; 14
for (i=0;i<5;++i) }5 15
stat(); 6 16
} 7
//Output is: 17
8 18
stat() { 9auto_var = 0, static_var= 0 19
Compilation spare :
Notions avances du C Prprocessing et compilation spare
extern : extern :
dclare dans un autre fichier
dclare dans un autre fichier dclare plus tard (plus bas)
Missions du prprocesseur
/ ajout a+b a c / 2
c += a +b ; 3 Programme avec commentaires :
/ 4 int a,b,c;
/ ajout a+b a c /
c += a +b ;
/
c += a +b ; 2
/ 3 J.-F. Lalande Programmation C 136/204
#include <stdio.h> 1
#include "/users/chris/essai/header.h" 2
#include "header.h" 3
Dfinition de constantes :
Notions avances du C Prprocessing et compilation spare
Dfinition de constantes :
Par :
J.-F. Lalande Programmation C 139/204
#define LG 20 1
int tab[LG]; 2
for ( i = 0 ; i < LG ; i++ ) 3
Attention cependant :
#define XMY xy 1
2
if (XMY 2 < z} 3
// Code 3 Effacement :
#endif 4 #undef variable
Effacement :
#undef variable 1
#define vrai 1 1
#define faux 0 2
#if vrai 3
// Code 4
#endif 5
#define DEBUG 1
#if defined DEBUG 2
code passe 3
#endif 4
#if defined(DEBUG) 5
code passe 6
#endif 7
4.4 Fichiers
Introduction aux I/O
Ouverture/Fermeture
int fclose(FILE ) ; 1
J.-F. Lalande Programmation C 146/204
Lecture/Ecriture de caractres
Lecture/Ecriture de caractres :
Notions avances du C Fichiers
EOF en cas derreur ou de fin de fichier fgetc : la valeur du caractre lu dans un entier ;
EOF en cas derreur ou de fin de fichier
Ecriture
fclose(fic); 12
Lecture/Ecriture de string
adresse de la zone de stockage des caractres en mmoire adresse de la zone de stockage des caractres en mmoire
nombre maximum de caractres (taille de la zone de stockage)
nombre maximum de caractres (taille de la zone de stockage) rfrence de type FILE du fichier ouvert
rfrence de type FILE du fichier ouvert renvoie : adresse reue en entre sauf en cas derreur
Attention linitialisation de la zone de stockage !
renvoie : adresse reue en entre sauf en cas derreur
Attention linitialisation de la zone de stockage ! J.-F. Lalande Programmation C 149/204
Lecture/Ecriture de string
De manire similaire :
Notions avances du C Fichiers
Lecture/Ecriture de string
int fputs(const char , FILE ); 1
Certains implmentation de primitives ne positionnent pas lindicateur : utiliser les valeurs de retours des fonctions.
#include <stddef.h> 2
struct automobile { 3 #include <stdio.h>
#include <stddef.h>
{ 12
printf ("Impossible d ouvrir le fichier FicParcAuto\n"); 13
return 1; 14
} 15
for (i = 0; i < 20; i++) 16
{ 17
fait = fread (&ParcAuto[i], sizeof (struct automobile), 1, TheFic); 18
if (fait != 1) 19
{ 20
printf ("Erreur lecture fichier parcauto \n"); 21
return 2; 22
} 23
} 24
fclose (TheFic); 25
return 0; } 26
I/O Formattes
A la manire de printf/scanf :
Notions avances du C Fichiers
I/O Formattes
int sprintf(char string, const char format, ...) ; 1
int sscanf(char string, const char format, ...) ; 2
int fprintf(FILE ,const char , ...) ; 3
int fscanf(FILE ,const char , ...) ; 4 A la manire de printf/scanf :
int sprintf(char string, const char format, ...) ;
int sscanf(char string, const char format, ...) ;
int fprintf(FILE ,const char , ...) ;
int fscanf(FILE ,const char , ...) ;
Retour : nombre de conversions russies.
Retour : nombre de conversions russies.
close(fic);
} } else fprintf(stderr, "Erreur douverture...\n"); 10
11
close(fic); 12 J.-F. Lalande Programmation C 156/204
Contrle du tampon
Contrle du tampon I
void setbuf(FILE flux, char tampon); 1
Vider le tampon :
int fflush(FILE ); 1
man setbuf Les trois types de tampons disponibles sont les suivants : pas de tampons, tampons de blocs, et tampons
de lignes. Quand un flux de sortie na pas de tampon, les donnes apparaissent dans le fichier destination, ou sur le
terminal, ds quelles sont crites. Avec les tampons par blocs, une certaine quantit de donnes est conserve avant
dtre crite en tant que bloc. Avec les tampons de lignes, les caractres sont conservs jusqu ce quun saut de ligne
soit transmis, ou que lon rclame une lecture sur un flux attach au terminal (typiquement stdin). La fonction fflush(3)
peut tre utilise pour forcer lcriture nimporte quel moment (voir fclose(3)). Normalement, tous les fichiers utilisent
des tampons de blocs. Quand une premire opration dentre-sortie se droule sur un fichier, malloc(3) est appele, et
un tampon est cr. Si le flux se rapporte un terminal (comme stdout habituellement) il sagit dun tampon de ligne.
Le flux standard de sortie derreur stderr na jamais de tampon par dfaut.
pf2 pointeur de fonction (param : 1 float, 1 int, retour : void) Exemple : pf pointeur de fonction (param : 2 int, retour : int)
int (pf)(int, int); / Dclare un pointeur de fonction. /
void (pf2)(float, int); / Dclare un pointeur de fonction. / 1 pf2 pointeur de fonction (param : 1 float, 1 int, retour : void)
void (pf2)(float, int); / Dclare un pointeur de fonction. /
En utilisant un typedef :
En utilisant un typedef : typedef int (PtrFonct)(int, int);
PtrFonct pf;
Utilisation
return 2i < j; } 8 void classer(int numtest, int reference, int tab[N], int (pf)(int, int)) {
int i;
9 for (i=0; i<N; i++) {
if ((pf)(tab[i], reference)) {
void classer(int numtest, int reference, int tab[N], int (pf)(int, int)) { 10 printf("Test %i: condition ok pour ref=%i tab[%i]=%i\n",numtest,reference,i,tab[i])
;
int i; 11 }}}
if ((pf)(tab[i], reference)) { 13
printf("Test %i: condition ok pour ref=%i tab[%i]=%i\n",numtest,reference,i,tab[i]); 14
}}} 15
16
int main(void) { 17
int i; int tab[N]; 18
int (pf)(int, int); / Dclare un pointeur de fonction. / 19
srand(time(NULL)); 20
for (i=0; i<N; i++) 21
tab[i] = rand() % 800; 22
pf = &compare1; 23
classer(1,500,tab,pf); 24
pf = &compare2; 25
classer(2,500,tab,pf); } 26
Options de gcc I
de sortie se nomme a.out,
-c -o file1.o pour crer un fichier-objet, ptions intressantes de gcc (Nicolas Jouandeau [6])
-o file pour renommer le fichier de sortie file. Sans cette
file1.c -o a.out file2.o file3.o pour crer un fichier ex- option, le fichier de sortie se nomme a.out,
-c -o file1.o pour crer un fichier-objet,
file1.c -o a.out file2.o file3.o pour crer un fichier
cutable rsultant du programme file1.c utilisant des fonctions dfinies dans excutable rsultant du programme file1.c utilisant des fonctions
dfinies dans les fichiers-objet file2.o et file3.o rsultats respectifs
les fichiers-objet file2.o et file3.o rsultats respectifs de la compilation sans de la compilation sans dition de liens de deux programmes C,
-O rduit la taille du code et le temps dxecution du programme,
dition de liens de deux programmes C, -O1 augmente le code en droulant les fonctions,
-O rduit la taille du code et le temps dxecution du programme, -O2 optimise plus que O1,
-Os diminue au maximum la taille du programme,
-O1 augmente le code en droulant les fonctions, J.-F. Lalande Programmation C 168/204
Bibliothque partage
Cration de la bibliothque :
Divers gcc
gcc c mnonoperations.c 2
ld G o mabib.so moperations.o mnonoperations.o 3
Cration de la bibliothque :
gcc c moperations.c
gcc c mnonoperations.c
Utilisation de la bibliothque : ld G o mabib.so moperations.o mnonoperations.o
Utilisation de la bibliothque :
5.2 Ncurses
Ncurses
Exemple Ncurses
n premier exemple :
Divers Ncurses
Exemple Ncurses I
#include <stdio.h> 1
#include <stdlib.h> 2 n premier exemple :
#include <curses.h> 3 #include <stdio.h>
#include <stdlib.h>
#include <signal.h> 4 #include <curses.h>
#include <signal.h>
5 static void finish(int sig);
static void finish(int sig); 6 int main(int argc, char argv[])
{
7 int num = 0;
int main(int argc, char argv[]) 8 / initialize your noncurses data structures here /
(void) signal(SIGINT, finish); / arrange interrupts to terminate /
{ 9
(void) initscr(); / initialize the curses library /
int num = 0; 10
J.-F. Lalande Programmation C 172/204
11
/ initialize your noncurses data structures here / 12
(void) signal(SIGINT, finish); / arrange interrupts to terminate / 13
14
(void) initscr(); / initialize the curses library / 15
keypad(stdscr, TRUE); / enable keyboard mapping / 16
(void) nonl(); / tell curses not to do NL>CR/NL on output / 17
(void) cbreak(); / take input chars one at a time, no wait for \n / 18
(void) echo(); / echo input in color / 19
20
if (has_colors()) 21
{ 22
start_color(); 23
24
/ 25
Simple color assignment, often all we need. Color pair 0 cannot 26
be redefined. This example uses the same value for the color 27
pair as for the foreground color, though of course that is not 28
necessary: 29
/ 30
init_pair(1, COLOR_RED, COLOR_BLACK); 31
init_pair(2, COLOR_GREEN, COLOR_BLACK); 32
init_pair(3, COLOR_YELLOW, COLOR_BLACK); 33
init_pair(4, COLOR_BLUE, COLOR_BLACK); 34
init_pair(5, COLOR_CYAN, COLOR_BLACK); 35
init_pair(6, COLOR_MAGENTA, COLOR_BLACK); 36
init_pair(7, COLOR_WHITE, COLOR_BLACK); 37
} 38
39
for (;;) 40
{ 41
int c = getch(); / refresh, accept single keystroke of input / 42
attrset(COLOR_PAIR(num % 8)); 43
num++; 44
/ process the command keystroke / 45
} 46
47
finish(0); / were done / 48
} 49
50
static void finish(int sig) 51
{ 52
endwin(); 53
/ do your noncurses wrapup here / 54
exit(0); 55
} 56
Compilation et fonctions
Divers Ncurses
Exemples
Exemple :
Divers Ncurses
move(5,4); 10 }
exit(0);
move(5,7); 12 }
Ncurses : menus
5
Poster le menu avec post_menu
Rafraichir lcran
6 Traiter les demandes de lutilisateur dans une boucle
5. Rafraichir lcran 7 Dposter le menu
8 Librer le menu avec free_menu
Librer les items avec free_item
6. Traiter les demandes de lutilisateur dans une boucle 9
10 Terminer ncurses
Exemple :
#include <stdio.h> 1
#include <stdlib.h> 2
#include <curses.h> 3
#include <menu.h> 4
#include <signal.h> 5
static void finish(int sig); 6
7
int main(int argc, char argv[]) { 8
int c; 9
signal(SIGINT, finish); 10
initscr(); 11
noecho(); 12
ITEM myitem[4]; 13
myitem[0] = new_item("Menu", "Description 1"); 14
myitem[1] = new_item("Menu2", "Description 2"); 15
myitem[2] = new_item("Menu3", "Description 3"); 16
myitem[3] = NULL; 17
MENU menu = new_menu(myitem); 18
post_menu(menu); 19
refresh(); 20
c = getch(); // Pause 21
set_current_item(menu, myitem[1]); // Dplacer la slection 22
refresh(); 23
c = getch(); // Pause 24
move(5,5); 25
refresh(); 26
printf("menu: %s", current_item(menu)>description); 27
while((c = getch()) != x) { 28
switch(c) { 29
case s: 30
menu_driver(menu, REQ_DOWN_ITEM); 31
break; 32
case z: 33
menu_driver(menu, REQ_UP_ITEM); 34
break; 35
case 10: / Enter / 36
move(20, 0); 37
clrtoeol(); 38
mvprintw(20, 0, "Item selected is : %s", 39
item_name(current_item(menu))); 40
pos_menu_cursor(menu); 41
break; 42
} 43
refresh(); 44
} 45
unpost_menu(menu); 46
free_menu(menu); 47
int i; 48
for(i = 0; i < 4; i++) 49
Oprateurs binaires
| : ou bit bit
^ : ou exclusif bit bit Oprations bit bit :
~ : complment 1 bit bit & : et bit bit
| : ou bit bit
Opration : op1 oprande op2 ^ : ou exclusif bit bit
~ : complment 1 bit bit
op1 et op2 de type int ou char Opration : op1 oprande op2
op1 et op2 de type int ou char
type de retour : int uniquement type de retour : int uniquement
Oprations de dcalage :
>> : dcalage droite
Divers Oprations binaires
Oprateurs de dcalage
<< : dcalage gauche
Dcalage gauche :
Oprations de dcalage :
expr1 << expr2 >> : dcalage droite
<< : dcalage gauche
expr1 est dcale gauche de expr2 bits Dcalage gauche :
expr1 << expr2
Des zros sont ajouts si ncessaire expr1 est dcale gauche de expr2 bits
Des zros sont ajouts si ncessaire
type de retour : du type de loprande de gauche type de retour : du type de loprande de gauche
Le masquage
p = n & ( 1 u << i ) ;
Utilisez des parenthses autour daffectations utilises comme valeurs logiques Affectation
if (a=b) { 1
... 2 Suggest parentheses around assignment used as truth value
Utilisez des parenthses autour daffectations utilises comme valeurs
logiques
if (a=b) {
...
if (a==b) { 1
... 2 if (a==b) {
...
if ((a=b)) {
if ((a=b)) { 3 ...
if ((a=b)!=0) {
... 4 ...
if ((a=b)!=0) { 5
... 6 J.-F. Lalande Programmation C 194/204
Format du printf
Et le fameux :
Et le fameux : s c a n f ("%30 s " , s t ) ; / Et l e & ? /
Return
} 5 Solutions :
Dclarations
too few/many arguments to function func too few/many arguments to function func
Pas le bon nombre darguments...
Pas le bon nombre darguments... int a,b;
int func(int a, double b);
func(a);
int a,b; 1 Passing arg n of func from incompatible pointer type
int func(int a, double b); 2 Ca progresse : le bon nombre mais le type nest pas bon !
func(a); 3 func(a,a);
Pointeurs et entiers
switch(x) { 2
case 2: 3
printf("Two\n"); 4 Erreur classique (difficile voir) : loubli du break.
int x = 2;
case 3: 5 switch(x) {
case 2:
printf("Three\n"); 6 printf("Two\n");
case 3:
} 7 }
printf("Three\n");
Feof et fgets
Ca ne marche pas (double affichage de la dernire ligne, feof renvoie true lorsque
Divers Cest tout cass, ca marche pas
#include <stdio.h> 1
Ca ne marche pas (double affichage de la dernire ligne, feof renvoie
int main() { 2 true lorsque fgets choue) :
FILE fp = fopen("test.txt", "r"); 3 #include <stdio.h>
int main() {
char line[100]; 4 FILE fp = fopen("test.txt", "r");
char line[100];
5 while( ! feof(fp) ) {
fclose(fp); 10
return 0; } 11
int main(int argc, char argv){ 1 Divers Cest tout cass, ca marche pas
0 1 2 3 4 5 6 7 4 5 6 7 4 5 6 7 4 5 6 7 4 5 6 7 4 5 6 7 4
5 6 7 4 5 6 7 4 ...
Programmation C 5.4 Cest tout cass, ca marche pas
int p; 3
p=&tab[1]; 4
// Remplire le tableau de 4 5
for(i=0;i<9;i++){ 6
(p+i)=4; 7
printf("%i ", i); 8
}} 9
0 1 2 3 4 5 6 7
4 5 6 7 4 5 6 7 4 5 6 7 4 5 6 7 4 5 6 7 4 5 6 7 4 5 6 7 4 ...