Écrire avec l’éditeur de votre choix le programme suivant (appeler le base.c
):
Dans un terminal, taper la commande suivante:
Normalement vous devez obtenir aucun message (cela signifie que tout s’est bien passé), la compilation a généré un programme dont le nom est a.out
(il s’agit du nom par défaut). Vous pouvez donc exécuter le programme compilé via la commande qui donne:
À partir de ce premier exemple, un certain nombre de choses sont à retenir. La démarche usuelle est de:
C
dans un éditeurgcc
), s’il y a des erreurs on retourne à l’étape 1./a.out
)C
Sans (trop) rentrer dans les détails de la programmation en C
, voici quelques explications #include <stdio.h>
est une directive du pré-processeur (elles commencent toutes par #
). Ici cela signifie que l’on inclut à notre fichier source, le contenu du fichier <stdio.h>
: il s’agit d’un fichier qui contient les fonctions usuelles d’entrée-sortie (saisie au clavier, affichage dans la console…). Sans elle, la fonction printf
n’est pas utilisable.
Dans votre fichier base.c
, retirer la première ligne. Re-compiler le fichier. Quelle est l’erreur obtenue ? Remettre la directive #include <stdio.h>
en début de fichier et constater en tapant gcc -E base.c
que votre fichier a été enrichi du fichier stdio.h
.
est le point d’entrée de votre programme, il s’agit de la première fonction qui sera exécutée par votre programme (même si elle se situe en fin de fichier). Un programme doit forcément contenir une fonction main
.
printf
est la fonction d’affichage du langage C
.
return 0;
signifie que la fonction main
renvoie la valeur 0.
il est possible d’avoir la valeur de retour de votre programme en tapant
dans un terminal. Modifier l’entier après return
dans votre programme C
, compiler, exécuter et vérifier que la valeur de retour est bien modifiée.
Il existe de nombreux compilateurs C
: ceux disponibles à Polytech Lille sont gcc
et clang
. Les différences entre gcc
et clang
sont détaillées à l’adresse https://clang.llvm.org/comparison.html. Pour un IMA3
, il est intéressant de constater que les messages d’erreurs sont plus ou moins simples à lire, comme par exemple:
donne avec gcc
:
avec clang
:
même si les deux donnent la même information importante (include stdio.h
), l’un est plus verbeux que l’autre. Cependant les différences entre les compilateurs peuvent être beaucoup plus importantes. Soit par exemple le fichier suivant (compil.c
):
Sans trop rentrer dans les détails, on peut remarquer que la suite d’instructions suivante est recopiée deux fois
la première fois dans le main
est la seconde fois dans une fonction qui s’appelle loop_example
. Compiler le programme et exécuter le. Vous devez normalement constater que l’affichage n’est pas celui attendu:
D’une part parce que les messages Hello World
de la fonction ne sont pas affichés et d’autre part parce que la valeur de i
est incohérente… et en plus elle change à chaque exécution (faites l’essai pour vérifier). C’est lié au fait que la variable i
n’est pas initialisée et donc elle peut prendre n’importe quelle valeur1. Pourtant cette erreur n’est ni détectée par gcc
, ni par clang
(à vérifier par vous-mêmes). Cependant si l’on ajoute les options de détection des alertes -W -Wall
à clang
via la commande
on obtient les messages suivants:
Le fait que i
ne soit pas initialisé est cette-fois ci bien indiqué (et ce pour les deux lignes concernées). Vérfier que malgré les options -W -Wall
, gcc
ne détecte pas ces alertes. Corriger le programme et vérifier que l’exécution est conforme à ce qui est attendu à savoir
Vous pouvez constater qu’il est possible d’afficher la fonction courante d’un programme via __func__
et de la ligne du programme via __LINE__
.
Enfin quel que soit le compilateur chois, il est possible de modifier le nom du programme générée en utilisant l’option -o
. Par exemple si on souhaite que notre programme s’appelle edinfo
, il suffit de taper (cela fonctionne aussi avec gcc
)
De la même manière que pour les commandes Linux
, vous pouvez rediriger les entrées-sorties. Par exemple en utilisant >
suivi d’un nom de fichier, tous les messages affichés par votre programme seront écrits dans le fichier et non dans le console. Essayer avec le fichier compil.c
.
Pour la redirection en entrée, écrire / compiler / exécuter le programme suivant:
Maintenant écrire dans un fichier (test_scanf.txt
par exemple), les valeurs 5 a 3.14 Exécuter le programme via ./a.out < test_scanf.txt
. Constater que vous n’avez plus besoin d’entrer de valeurs au clavier mais que tout est lu directement dans le fichier.
À partir des programmes précédents et de l’aide éventuelle sur printf
(man 3 printf
) et sur scanf
(man 3 scanf
), écrire un programme qui lit 10 nombres au clavier (ou dans un fichier via une redirection) et qui en affiche la moyenne à l’écran (ou dans un fichier via une redirection). Regarder les erreurs générées quand le format n’est pas bon (par exemple un caractère à la place d’un nombre) ou quand le nombre d’éléments attendus n’est pas bon (moins de 10 valeurs).
le premier qui trouve pourquoi i
est correctement initialisé à 0 dans le main
gagne un bonus ↩