Le prototype de la fonction main()



Documents pareils
3IS - Système d'exploitation linux - Programmation système

Arguments d un programme

Programmation système I Les entrées/sorties

Programmation système de commandes en C

1/24. I passer d un problème exprimé en français à la réalisation d un. I expressions arithmétiques. I structures de contrôle (tests, boucles)

Cours Programmation Système

Introduction au langage C

Bases de programmation. Cours 5. Structurer les données

Cours de C. Petits secrets du C & programmation avancée. Sébastien Paumier

MISE A NIVEAU INFORMATIQUE LANGAGE C - EXEMPLES DE PROGRAMMES. Université Paris Dauphine IUP Génie Mathématique et Informatique 2 ème année

Cours 6 : Tubes anonymes et nommés

IN Cours 1. 1 Informatique, calculateurs. 2 Un premier programme en C

Le langage C. Séance n 4


Programmation système en C/C++

Compression de Données - Algorithme de Huffman Document de Conception

Le système de gestion des fichiers, les entrées/sorties.

Outils pour la pratique

INFO-F-404 : Techniques avancées de systèmes d exploitation

1. Structure d un programme C. 2. Commentaire: /*..texte */ On utilise aussi le commentaire du C++ qui est valable pour C: 3.

Éléments d informatique Cours 3 La programmation structurée en langage C L instruction de contrôle if

Cours d Algorithmique-Programmation 2 e partie (IAP2): programmation 24 octobre 2007impérative 1 / 44 et. structures de données simples

Utilisation d objets : String et ArrayList

Java Licence Professionnelle CISII,

Brefs rappels sur la pile et le tas (Stack. / Heap) et les pointeurs

Les structures. Chapitre 3

Cours de Programmation Impérative: Zones de mémoires et pointeurs

Algorithmique et Programmation, IMA

DNS Server RPC Interface buffer overflow. Céline COLLUMEAU Nicolas BODIN

Exceptions. 1 Entrées/sorties. Objectif. Manipuler les exceptions ;

Cours 14 Les fichiers

Cours d initiation à la programmation en C++ Johann Cuenin

Conventions d écriture et outils de mise au point

Le Langage C Version 1.2 c 2002 Florence HENRY Observatoire de Paris Université de Versailles florence.henry@obspm.fr

I. Introduction aux fonctions : les fonctions standards

Seance 2: En respectant la méthode de programmation par contrat, implémentez les autres fonctions de jeu.

INTRODUCTION A JAVA. Fichier en langage machine Exécutable

Les structures de données. Rajae El Ouazzani

Programmation C. Apprendre à développer des programmes simples dans le langage C

Licence Bio Informatique Année Premiers pas. Exercice 1 Hello World parce qu il faut bien commencer par quelque chose...

Chapitre 1 : La gestion dynamique de la mémoire

Exercice sur les Dockers

OS Réseaux et Programmation Système - C5

TRAVAUX PRATIQUES Programmation Système Langage C / Système UNIX. 2 e année Génie Informatique

Les processus. Système L3, /39

Archivage Messagerie Evolution pour usage HTML en utilisant Hypermail

Chapitre 10. Les interfaces Comparable et Comparator 1

Gestion de la mémoire

03/04/2007. Tâche 1 Tâche 2 Tâche 3. Système Unix. Time sharing

Premiers Pas en Programmation Objet : les Classes et les Objets

Gestion distribuée (par sockets) de banque en Java

Les chaînes de caractères

Claude Delannoy. 3 e édition C++

Présentation du langage et premières fonctions

TD2/TME2 : Ordonnanceur et Threads (POSIX et fair)

TD3: tableaux avancées, première classe et chaînes

Programmation Classique en langage C

Mon premier rpm. 7 juin Avant de commencer RPM URPMI RPMBUILD... 2

EPREUVE OPTIONNELLE d INFORMATIQUE CORRIGE

Les fichiers. Chapitre 4

Programmation Réseau SSH et TLS (aka SSL)

Chap III : Les tableaux

Architecture des ordinateurs

Programmation impérative

Compléments de documentation Scilab : affichage de texte et formatage de nombres

Les arbres binaires de recherche

Langage propre à Oracle basé sur ADA. Offre une extension procédurale à SQL

Représentation d un entier en base b

Simulation d un système de paiement par carte bancaire

Derrière toi Une machine virtuelle!

INF 104 (SELC) Introduction au langage C

TP n 2 Concepts de la programmation Objets Master 1 mention IL, semestre 2 Le type Abstrait Pile

STAGE IREM 0- Premiers pas en Python

COMPARAISONDESLANGAGESC, C++, JAVA ET

INF2015 Développement de logiciels dans un environnement Agile. Examen intra 20 février :30 à 20:30

Info0101 Intro. à l'algorithmique et à la programmation. Cours 3. Le langage Java

PROGRAMMATION PAR OBJETS

ACTIVITÉ DE PROGRAMMATION

Programmation en langage C

Programmation C++ (débutant)/instructions for, while et do...while

Cours de Système : Gestion de Fichiers

Introduction à Java. Matthieu Herrb CNRS-LAAS. Mars

DE L ALGORITHME AU PROGRAMME INTRO AU LANGAGE C 51

Utilisation de la Kinect

Le traitement du temps

INF111. Initiation à la programmation impérative en C amini/cours/l1/inf111/ Massih-Reza Amini

Centre CPGE TSI - Safi 2010/2011. Algorithmique et programmation :

Introduction au calcul parallèle avec OpenCL

INITIATION A LA PROGRAMMATION

La mémoire. Un ordinateur. L'octet. Le bit

Cours Langage C/C++ Programmation modulaire

Cours 1: Java et les objets

Introduction à la programmation orientée objet, illustrée par le langage C++ Patrick Cégielski

INFO-F-105 Language de programmation I Séance VI

Lier Erlang avec d autres langages de programmation

Langages et Concepts de Programmation Introduction à la programmation en langage C

Programmation en C. École Nationale Supérieure de Techniques Avancées. Pierre-Alain Fouque et David Pointcheval

Notes de Cours - Programmation Pascal Ferraro

Projet de programmation (IK3) : TP n 1 Correction

UEO11 COURS/TD 1. nombres entiers et réels codés en mémoire centrale. Caractères alphabétiques et caractères spéciaux.

Transcription:

Le prototype de la fonction main() 1. Introduction...1 2. Paramètres et type de retour de la fonction main()...1 3. Exemple 1...2 4. La fonction exit() du C...2 5. Détecter le code de retour d un programme depuis le Terminal...3 6. Parsing des paramètres et exemple 2...3 1. Introduction Pour lancer une commande dans le Terminal, vous tapez le nom de la commande suivi de ses arguments ou paramètres. Lorsqu on lance un programme écrit en C depuis le Terminal, on peut de la même manière fournir des arguments au programme, par exemple en tapant : $./monprogramme coucou 233 -c Mais comment récupérer ces arguments dans le programme C lui même? 2. Paramètres et type de retour de la fonction main() La fonction main() d un programme C est la première fonction exécutée lors du lancement du programme. Le langage C spécifie un prototype complet pour la fonction main() (paramètres et un type de retour) qui, justement, permet au programme de récupérer ses paramètres. Le prototype complet de la fonction main() d un programme C est : int main(int argc, char *argv[]) ; où : int argc est le nombre de paramètres effectivement passé au programme. Ce nombre est toujours > 1 car le premier paramètre est toujours le nom de l exécutable. char * argv [] est un tableau de chaine de caractères contenant les paramètres effectivement passés au programme. Le premier élément de ce tableau (argv[0]) contient toujours le nom du programme (ou plus précisément le chemin utilisé pour accéder au fichier exécutable). C est bien utile car on ne sait pas, dans le code C, comment le fichier exécutable s appelle : ce fichier exécutable a pu être renommé par exemple après avoir été compilé! Le i ème élément du tableau, argv[i], est une chaine qui contient le i ème paramètre passé au programme. Par ailleurs, conformément au prototype de la fonction main(), un programme C doit retourner (return) lorsqu il se termine «code de retour» entier. Ce code de retour permet au programme de faire savoir au système si une erreur a été détectée. On retiendra que, par convention : le main() doit retourner 0 (ou la constante EXIT_SUCCESS, définie dans stdlib.h, qui vaut 0) si tout s est bien passé le main() doit retourner un nombre non nul en cas d erreur.

Le choix d une valeur quelconque non nulle en cas d erreur permet à votre programme de savoir quel est le type d erreur, en associant une valeur entière à une erreur donnée. La constante EXIT_FAILURE, définie dans stdlib.h, non nulle, permet de retourner un code d erreur par défaut si on a pas besoin de valeurs spéciales. Toutefois, les codes de retour compris entre 126 et 255 sont réservés par le système pour des erreurs spéciales. Par exemple, un code de retour valant 139 signifie qu une «segmentation fault» (erreur d accès mémoire) a eu lieu dans le programme et que le programme a planté. 3. Exemple 1 Le programme simple suivant affiche les paramètres qui lui sont passés depuis le Terminal : //prg.c int main ( int argc, char * argv[] ) { int i; // affichage des arguments printf("nombre d arguments passes au programme : %d\n", argc); for(i = 0 ; i< argc ; i ++) { printf(" return 0 ; argv[%d] : %s \n", i, argv[i]); Une fois ce programme compilé, si l'utilisateur le lance depuis le Terminal en tapant : $./prg.exe test.txt 2 alors le programme affichera dans le Terminal : Nombre d arguments passes au programme : 3 argv[0] :./prg.exe argv[1] : test.txt argv[2] : 2 puis retournera 0 (tout s est bien passé). 4. La fonction exit() du C En C, la fonction exit(int status) permet de terminer le programme en retournant le code erreur status. Voir man exit S3 Ainsi, ou que l on soit dans la code, on peut utiliser exit() pour arrêter le programme. Par exemple : long fact( long n) { if( n < 0 ) { exit( EXIT_FAILURE) ; //

5. Détecter le code de retour d un programme depuis le Terminal Pour information, puisqu un programme C retourne un code erreur, le Terminal est bien sur armé pour traiter ce code erreur. Il suffit de savoir deux choses : La commande echo du Terminal permet d afficher une chaine de caractère. Par exemple echo toto affiche toto. A tout instant, la variable $? contient toujours la valeur de retour du dernier programme exécuté Ainsi, si on tente de supprimer un fichier toto qui n existe pas avec rm, rm affiche un message d erreur et retourne bien un code erreur non nul : $ rm toto rm: toto: No such file or directory $ echo $? 1 6. Parsing des paramètres et exemple 2 Un programme commence par analyser (ou «parser») les paramètres pour 1/ vérifier qu ils respectent bien ce qui est attendu (qu on a passé un entier si on attend un entier par exemple) et 2/ initialiser ses variables. L exemple suivant propose une structure pour se faire, qui est très courante et que vous pourrez réutiliser. Supposons qu on veuille écrire un programme qui affiche plusieurs fois dans le Terminal le contenu d un fichier, texte ou binaire dont le chemin est passé en paramètre. Le format qu on retient pour les paramètres à passer au programme est donc : Premier paramètre : option txt ou bin Second paramètre : nom du fichier, chaine de caractère Troisième paramètre : entier, optionnel Le programme suivant analyse ces paramètres :

#include <stdio.h> #include <stdlib.h> // Affiche l'aide du programme void printhelp(char * prgname) { printf("%s\n", prgname); printf(" Displays the content of a txt or binary file\n"); printf(" Usage:\n"); printf(" %s <opt> <filename> (<nb>)\n", prgname); printf(" where:\n"); printf(" <opt> is either '-txt' or '-bin' (txt or bin file).\n"); printf(" <filename> is the name of the file to display.\n"); printf(" <nb> is the number of display to achieve.\n printf(" Optinal, default 1.\n"); // Affiche l'erreur errstr, puis l'aide du programme void printerror(char * prgname, char * errstr) { printf("error : '%s'\n", errstr); printhelp(prgname); int main(int argc, char *argv[]) { int mode ; // 0 => txt ; 1 => binary char *filename = NULL; FILE * fileptr = NULL; int nbdisplay = 1; int i; // parsing des arguments if(argc < 3 argc > 4) { printerror( argv[0], "number of args invalid" ); return EXIT_FAILURE; // affichage aide if( strcmp(argv[1], "-h") == 0 strcmp(argv[1], "-help") == 0) { printhelp(argv[0]); return EXIT_SUCCESS; // type de fichier if( strcmp(argv[1], "-txt") == 0) { mode = 0; else if( strcmp(argv[1], "-bin") == 0) { mode = 1; else { printerror( argv[0], "-txt or -bin required" ); // nom du fichier filename = argv[2];

// entier if(argc == 4) { // on attend un entier! if( sscanf(argv[3], "%d", &nbdisplay)!= 1) { printerror( argv[0], "Integer awaited" ); // c'est parti! switch(mode) { case 0: fileptr = fopen (filename, "rt"); case 1: fileptr = fopen (filename, "rt"); if(fileptr == NULL) { printerror( argv[0], "Cannot open file" ); for(i = 0 ; i < nbdisplay ; i ++) { switch(mode) { case 0: // displaytxtfile(fileptr); // fct supposee existante case 1: // displaybinfile(fileptr); // fct supposee existante fclose(fileptr); return EXIT_SUCCESS; Pour information, la fonction getopt() (voir man getopt S3) définie dans unistd.h peut aider à l analyse des paramètres d un programme.