Analyse de la structure d’un programme C

24 juin 2019 COLLECTION POUR LES NULS

 

Pour bien comprendre comment se présente un code source en C, nous allons tenter de créer progressivement le plus petit programme qui soit. Bien sûr, il ne fera rien d’utile. C’est un cas d’école. Nous utiliserons l’outil Code ::Blocks que nous avons présenté dans Les bases de la programmation en langage C - Les outils nécessaires

 

ÉTAPE 1 : Servez-vous des conseils qui suivent pour créer un premier projet dans l’atelier Code::Blocks sous le nom de projet exemple.

 

Voici les étapes détaillées :

1. Dans Code::Blocks, démarrez un nouveau projet (commande File/New/Project) et nommez-le exercice.

2. Dans le volet de projet à gauche, ouvrez les détails jusqu’à afficher le code source de main.c.

Le code source de main.c ne va être constitué que d’une seule ligne vide. Pour y parvenir, sélectionnez tout le squelette inséré par Code::Blocks et supprimez-le.

3. Enregistrez le projet par File/Save file (raccourci Ctrl+S).

4. Lancez la compilation/liaison/exécution par Build/Build and run (raccourci F9).

 

L’atelier Code::Blocks affiche un message d’erreur. Aïe ! Du fait que le code source est vide, le programme exécutable n’a pas été généré et ne peut donc pas être exécuté. Le message qu’affiche Code::Blocks est lié au fait que l’environnement a demandé au système d’exploitation de lancer l’exécution d’un programme alors que le fichier n’existe pas.

 

Création de la fonction principale main()

Un programme C doit toujours contenir au minimum une fonction principale nommée main(). C’est la première instruction de cette fonction qui est exécutée lorsque le système déclenche le début d’exécution du programme. Puisque c’est une fonction, le nom doit être suivi d’une paire de parenthèses (même vide) et d’un couple d’accolades (même vide) destinés à délimiter le bloc d’instructions de cette fonction (Listing 1).

 

ÉTAPE 2 : Enrichissez le code source du projet exercice comme proposé dans le Listing 1. Enregistrez le projet, puis lancez la compilation/exécution (Build and run).

 

LISTING 1 : La fonction main() minimale

main() {}

 

Dorénavant, la fenêtre de terminal apparaît, mais elle n’affiche rien qui soit en rapport avec l’activité du programme. C’est déjà bien ! Vous n’avez demandé aucun travail à votre projet, et il s’y est tenu. Vous avez écrit le plus petit programme C acceptable par le compilateur. C’est une sorte d’ébauche.

  • main n’est pas un mot-clé, mais presque : c’est le nom réservé d’une fonction qui doit exister dans tout fichier de code source principal en langage C.
  • Contrairement à toutes les autres fonctions, vous n’avez pas besoin de déclarer main() par un prototype. Cela dit, cette fonction peut être utilisée sans aucun argument d’entrée (parenthèses vides), ou bien avec des arguments d’entrée.

 

Renvoi d’une valeur au système d’exploitation

Pour se conformer au protocole, il est conseillé de faire en sorte que lorsque l’exécution de votre programme s’achève, il renvoie au système d’exploitation une valeur numérique. Considérez cela comme une marque de respect ; il rend son rapport. La valeur est un entier, normalement zéro si tout s’est bien passé, et une valeur différente sinon. La valeur permet d’informer le système du type de problème rencontré.

 

ÉTAPE 3 : Enrichissez le code du projet exemple pour qu’il corresponde au Listing 2.

 

LISTING 2 : Ajout d’une instruction return et typage de main()

int main()

{

return(1);

}

 

Tout d’abord, nous qualifions la fonction main() en ajoutant avant son nom le mot-clé de type int. Il déclare (à l’attention du compilateur) le type de la valeur que la fonction main() va renvoyer (on dit aussi générer).

 

Nous avons ensuite ajouté une instruction return en spécifiant en argument la valeur 1. C’est cette valeur qui sera transmise au système d’exploitation en fin d’exécution de la fonction main() qui est la dernière (et la première aussi) à être exécutée dans ce programme.

 

Petit + : Lorsque vous saisissez le mot return, l’atelier Code::Blocks va sans doute ouvrir un volet de suggestion de fin de saisie (Auto Complete), comme le montre la Figure 1. Ces suggestions de complètement vous seront utiles plus tard, mais lors de vos premiers pas, vous pouvez les ignorer.

 

FIGURE 1 :

 

ÉTAPE 4 : Enregistrez, compilez et exécutez le projet.

 

L’exécution se déroule comme auparavant, sauf que vous voyez dans la fenêtre de terminal un message comme quoi le processus a renvoyé la valeur 1 :

Process returned 1 (0x1)

 

Vous pouvez éventuellement, dans le code source, modifier la valeur numérique renvoyée puis recompiler et relancer (indiquez par exemple 5). Le message affiché en fin d’exécution doit refléter la nouvelle valeur.

  • Par convention, la valeur renvoyée 0 est utilisée pour confirmer que le programme s’est exécuté sans aucun problème.
  • Une valeur égale ou supérieure à 1 avertit d’une erreur, mais cela peut aussi signifier le résultat particulier d’un traitement.
  • Le paramètre du mot-clé return peut en théorie être indiqué sans le couple de parenthèses, comme ceci :
return 1;
  • Dans le Listing 3.7, nous utilisons return avec son couple de parenthèses. Je préfère cette notation, plus en cohérence avec les arguments de fonctions, et c’est celle en vigueur dans ce livre.

 

Ajout d’un appel de fonction

Un programme est intéressant lorsqu’il fait quelque chose. Nous pourrions obtenir des traitements utiles uniquement avec des mots-clés du langage et des opérateurs, mais il faut au minimum pouvoir en afficher le résultat à l’écran.

Nous allons ajouter un appel de fonction d’affichage.

 

ÉTAPE 5 : Enrichissez le code source en insérant les trois nouvelles lignes marquées par des commentaires. Ne perdez pas votre temps à saisir la partie commentaires. L’objectif est d’aboutir au Listing 3.

 

LISTING 3 : Enrichissement du projet

#include <stdio.h>         // Nouvelle ligne

                // Nouvelle ligne d'aération

int main()

{

printf("4 fois 5 font %d\n", 4*5); // Nouvelle ligne

return(0);

}

 

 

Nous ajoutons trois lignes :

 

Tout au début, nous ajoutons la ligne de la directive #include qui demande d’insérer à sa place le prototype de la fonction standard printf() dont nous avons besoin.

 

Juste après, nous insérons une ligne vide pour séparer la directive du début de la fonction main().

 

Comme première instruction dans notre unique fonction, nous ajoutons un appel à la fonction printf() avec deux arguments, une chaîne entre guillemets et une expression de calcul.

 

Toute fonction doit être déclarée avant sa première utilisation. Le fichier stdio.h stipulé contient la déclaration de printf() (parmi beaucoup d’autres).

 

Dès que vous saisissez le premier guillemet dans la ligne de printf(), l’atelier vous propose d’insérer le guillemet complémentaire correspondant. Code::Blocks cherche à vous aider (Figure 2). Ne vous laissez pas perturber et poursuivez la saisie. Le guillemet est le bienvenu.

 

FIGURE 2 : Aide à la saisie d’une fonction dans Code::Blocks.

 

Avant de passer aux tests, revérifiez les deux points suivants dans votre code source :

  • Vérifiez que vous avez bien saisi la ligne #include comme ceci :
#include <stdio.h>
  • Cette directive #include demande au compilateur d’insérer le contenu du fichier d’en-tête stdio.h. Ce fichier contient l’indispensable déclaration de la fonction printf().
  • Vérifiez ensuite la ligne de l’instruction printf() :
  • La fonction printf() envoie son premier argument (celui entre guillemets) vers la sortie standard qui est l’écran. Le second argument est une expression mathématique, 4*5. Le résultat de cette multiplication sera calculé par l’ordinateur puis transmis à la fonction pour affichage :
     printf("4 fois 5 font %d\n", 4*5);

 

Le contenu du jeu de parenthèses de printf() est riche, et tout est absolument nécessaire: les guillemets, la virgule, le point-virgule. N’oubliez rien ! Ne cherchez pas à comprendre l’instruction printf() pour l’instant. Nous y reviendrons plus longuement par la suite.

 

Notez que je propose enfin de changer la valeur renvoyée dans return de 1 en 0, car c’est par convention la valeur que retransmet un programme quand il s’est exécuté correctement.

 

 

ÉTAPE 6 (FIN) : : Enregistrez le fichier de code source puis lancez la compilation/exécution.

 

Si une erreur survient, vérifiez les lignes source une à une. Si tout se passe bien, vous devriez voir s’afficher le résultat dans la fenêtre de terminal :

 

4 fois 5 font 20

 

Le programme C que nous venons de construire progressivement correspond au programme basique. Dans la suite de votre exploration du langage, vous découvrirez bien d’autres fonctions et vous allez être de plus en plus à l’aise avec les mécanismes du langage C.

Apprendre à programmer en C pour les Nuls grand format, 2e édition

Ce nouveau livre de la collection «» va vous donner en quelque 500 pages toutes les connaissances qu...

Les livres

Découvrez également