Introduction au langage C/Premier programme
Introduction
modifierCe chapitre vous permettra d'obtenir toutes les informations nécessaires et détaillées pour construire un programme simple.
Les programmes que nous allons faire seront pour la plupart des programmes à affichage dans le mode console.
Le programme
modifierColler le code ci-dessous dans un fichier nommé hello.c.
/*
Nom : hello.c
Role : Afficher Bonjour le monde à l'écran.
Paramètres : non pris en compte.
Code retour : 0 (EXIT_SUCCESS)
*/
#include <stdio.h>
#include <stdlib.h>
int main(void)
{
/* Écrire Bonjour le monde, à l'écran */
(void)puts("Bonjour le monde");
/* Quitte le programme et
retourne la constante EXIT_SUCCESS */
return EXIT_SUCCESS;
}
Sous Windows ou Unix, lancer la commande de compilation :
gcc hello.c -o hello
Ensuite il suffit d'exécuter le fichier créé par cette opération (hello).
Explications
modifierCommentaires
modifierUn commentaire en C peut s'écrire de deux manières :
- de façon classique en C, qui commence avec
/*
et finit avec*/
:
/* le commentaire commence ici
et se termine ici */
/* Un commentaire sur une seule ligne */
- depuis C99, comme en C++ pour une seule ligne :
// commentaire
Conseils de codage à respecter : c_lis_1, c_lis_2, c_mod_2.
Include
modifier #include <stdio.h>
Lors d'un processus appelé "précompilation", un petit programme que l’on appelle préprocesseur ajoute, supprime et remplace des parties de votre source. Il traite les lignes commençant par le signe #. Cette précompilation fait partie de la chaine de compilation mais ce processus n’est pas lié directement à la compilation elle-même : le préprocesseur ne connait pas le langage C. C'est un programme qui manipule du texte.
L'option -E du compilateur gcc permet de voir à l'écran le résultat de cette phase.
gcc -E hello.c | more
Le code #include <stdio.h>
demande au préprocesseur d'inclure le fichier stdio.h, qui contient le prototype (la description) de la fonction puts
, utilisée plus tard dans le programme. Ce fichier d'extension .h est situé le plus souvent dans le dossier /usr/include ou dans un fichier de l'arborescence liée au compilateur, que nous aborderons plus tard dans le cours.
Il y a plusieurs manières d’utiliser l'instruction #include.
- #include < nom_de_fichier > pour aller chercher un fichier dans les fichiers à inclure du compilateur.
- #include " nom_de_fichier " pour aller chercher un fichier créé par l'utilisateur dans le dossier du programme.
Le code machine de la fonction puts est fourni par une bibliothèque précompilée libC liée au programme lors de la phase d'édition de liens.
Conseil de codage à respecter : c_mod_9.
Fonction principale main
modifierChaque programme possède une fonction main
. La fonction main
est obligatoire dans tout programme en C standard. C'est le point d'entrée du programme lors de son exécution.
Si l’on ne veut pas récupérer de paramètres de la ligne de commande qui a permis de lancer l'exécutable :
int main(void)
{
return EXIT_SUCCESS;
}
ou en souhaitant utiliser les paramètres :
int main(int argc, char *argv[])
{
return EXIT_SUCCESS;
}
L'argument argc donne le nombre d'arguments reçus augmenté de un. L'argument argv donne la liste des arguments passés à l'appel de notre programme. C'est un tableau de chaines de caractères avec argv[0] : le nom du programme, argv[n] : valeur du paramètre numéro n.
Conseil de codage à respecter : c_lis_10.
Fonctions
modifier- Une fonction est une série d'instructions. Une fonction peut être appelée par une autre fonction et doit retourner une valeur sauf si elle est du type void.
- Elle peut prendre des arguments dont les noms et types sont définis entre les parenthèses. Si la fonction n'attend aucun paramètre, on l'indique par le mot réservé void entre parenthèses.
Conseils de codage à respecter : c_rec_10, c_rob_5.
Retour de valeurs
modifier return EXIT_SUCCESS;
Le return EXIT_SUCCESS est là pour signifier au système d'exploitation que le logiciel a été exécuté sans erreur. EXIT_SUCCESS est une constante qui vaut 0, elle est définie dans stdlib.h.
On peut donc, si une erreur se produit, retourner au système une autre valeur que 0 par return x; où x est une variable qui contiendrait une valeur entière autre que 0. On peut ainsi associer une certaine valeur à un certain type d'erreur. Il est conseillé de n'avoir qu'un seul point de sortie par fonction.
Lorsque la fonction main() aura terminé d'exécuter ses instructions, le programme se terminera.
Conseil de codage à respecter : c_exp_3.
Utilisation de fonctions
modifierLa bibliothèque standard du langage C fournit les fonctions essentielles d'accès aux entrées et sorties du programme (accès aux fichiers et à l'affichage). Cela peut paraitre peu, mais un programme très complexe peut être entièrement construit à partir de ces fonctions.
Si une fonction retourne une valeur que l’on souhaite stocker dans une variable, la syntaxe suivante est utilisée pour son appel :
variable = nom_de_la_fonction(argument1, argument2);
/* Le prototype de la fonction fabs
se trouve dans l'include math.h */
#include <math.h>
double valeurAbsolue;
valeurAbsolue = fabs(-2.0);
/* valeurAbsolue sera donc égal à 2.0 car la fonction fabs()
renvoie la valeur absolue de la valeur passée en paramètre
Cette fonction fabs attend un paramètre de type double
et retourne une valeur de type double. */
ou si on ne souhaite pas utiliser le code retour de la fonction :
(void)nom_de_la_fonction(argument1, argument2);
Exemple de fonction bonjour qui n'accepte pas de paramètre et ne retourne pas de valeur :
bonjour();
// C'est une fonction fictive qui afficherait bonjour par exemple.
Le code retour, les paramètres (nombre et types) d'une fonction doivent être conformes à ceux définis dans son prototype sous peine d'erreur ou d'avertissement lors de la compilation. Si le compilateur est ancien ou rendu laxiste, cela pourra conduire à une erreur difficile à trouver lors de l'exécution du programme.
Conseil de codage à respecter : c_rob_3.
Génération d'un exécutable
modifierLa chaine de compilation
modifierLe but est d'obtenir un fichier exécutable que vous pourrez faire marcher sur votre ordinateur. La chaine de compilation permet de passer du code source d'un programme à un binaire exécutable.
On peut distinguer trois phases principales :
- Le prétraitement : Traitement par le préprocesseur des fichiers sources .c et .h., le résultat est du fichier texte lisible avec un éditeur.
- La compilation du ou des fichiers issus de l'étape précédente. Cette phase complexe produit des fichiers binaires d'extension .o dans lesquels le texte a été transformé en un langage compréhensible par la machine.
- L'édition de lien qui rassemble les fichiers précédents et d'autres bibliothèques pour produire un fichier exécutable.
Pour les programmes simples, il est possible de demander au compilateur C d'enchainer les trois phases précédentes et de produire simplement un exécutable compatible avec votre machine.
Disposer d'un compilateur
modifierVous devez disposer d'un compilateur C.
La suite libre GCC de la Free Software Foundation[1] va vous permettre de mettre en pratique ce cours.
Vous trouverez des conseils de mise en œuvre selon votre plateforme informatique sur le wiki Livre Exercices en langage C.
Compiler le premier programme
modifier- Créez un répertoire de travail.
- Copiez le code source du programme bonjour.c dans un éditeur de texte du genre textedit ou notepad, sauvegardez dans un fichier de nom bonjour.c dans le répertoire précédemment créé ( Celui même de l'étape n°1 ).
- Ouvrez une fenêtre de commande sur le répertoire précédent.
- Tapez la commande : gcc -o hello.exe hello.c
Cette commande demande au compilateur gcc :
- de compiler le fichier source hello.c
- de nommer le fichier exécutable produit : hello.exe, grâce à l'option -o.
Exécuter le programme
modifierLancer la commande : hello.exe ou ./hello.exe
Vous devriez voir s'afficher :
MacMini-TM:~/Documents/developpement/c thierry$ ./hello.exe
Bonjour le monde
MacMini-TM:~/Documents/developpement/c thierry$
Conseil de codage à respecter : c_rob_1.
Pour aller plus loin
modifierAide sur les commandes et fonctions C
modifierVous pouvez obtenir de l'aide :
- Sur l’internet;
- Pour les utilisateur UNIX, Linux et Mac à l'aide de la commande man. Exemple : man -s3 printf
Projets plus importants
modifierVous pouvez :
- Répartir vos fonctions dans plusieurs fichiers.
- Automatiser la génération des exécutables à l'aide de l'outil make.
- Utiliser un environnement de développement intégré (IDE).
Utilisation de bibliothèques
modifierUne bibliothèque est un ensemble de fonctions définies par vous ou un autre programmeur, pour être appelées par votre programme. Cela permet la réutilisation briques logicielles qui allègeront vos programmes.
Elles peuvent être fournies sous forme de code source ou de fichiers binaires à lier à vos programmes (exemple d'extension rencontrées : .a .so .dll). Des fichiers ".h" qui contiennent les prototypes et constantes liées aux fonctions de la bibliothèque et seront inclus dans vos fichiers sources.
Bibliothèques de base du langage C
modifierVoir le chapitre 10 sur les fonctions de base[2] :
Bibliothèques Unix du langage C
modifierBibliothèques graphiques
modifier- GTK : Gimp ToolKit
- QT, en C++
- API Win32, pour la plateforme Windows de Microsoft
- SDL, Simple DirectMedia Layer
Bibliothèques 3d
modifierFramework
modifierCertains programmes fournissent même leurs propres bibliothèques pour ajouter des modules et/ou des fonctionnalités à leurs logiciels. On appelle cet ensemble de bibliothèques propres à un environnement de développement intégré (IDE) un Framework (plateforme de travail).
TP
modifierVoir aussi
modifier- Wikilivre Programmation C, chapitre Bases du langage.
- ↑ Le site de la FSF (Free Software Foundation) consacré au projet GCC : [1].
- ↑ cplusplus.com Site anglais de référence sur les fonctions de base.