Introduction à Make et aux fonctions pseudo-aléatoires



Documents pareils
Quelques éléments de compilation en C et makefiles

Cours Langage C/C++ Programmation modulaire

1.6- Génération de nombres aléatoires

Le traitement du temps

Notes du cours 4M056 Programmation en C et C++ Vincent Lemaire et Damien Simon

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

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

Le langage C. Séance n 4

Algorithmique et Programmation, IMA

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

Les chaînes de caractères

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

Programmation en langage C

I. Introduction aux fonctions : les fonctions standards

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

Le prototype de la fonction main()

Cours Programmation Système

Programmation système en C/C++

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

TP 1. Prise en main du langage Python

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

Introduction au langage C

Java Licence Professionnelle CISII,

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

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

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

#include <stdio.h> #include <stdlib.h> struct cell { int clef; struct cell *suiv; };

Outils pour la pratique

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

C++ Programmer. en langage. 8 e édition. Avec une intro aux design patterns et une annexe sur la norme C++11. Claude Delannoy

Chapitre 10 : Logiciels

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

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

INITIATION AU LANGAGE C SUR PIC DE MICROSHIP

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

Programmation système I Les entrées/sorties

Les structures. Chapitre 3

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

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

Performances et optimisations

Archivage Messagerie Evolution pour usage HTML en utilisant Hypermail

Arguments d un programme

TP : Shell Scripts. 1 Remarque générale. 2 Mise en jambe. 3 Avec des si. Systèmes et scripts

DE L ALGORITHME AU PROGRAMME INTRO AU LANGAGE C 51

TP1. Outils Java Eléments de correction

Travaux Dirigés n 1 : chaînes de caractères

30.avr.10 Présentation miniprojet. 9.mars.10 Cours 3 4.mai.10 Cours C mars.10 Cours 4 11.mai.10 Cours C++ 2

Cours 1: Java et les objets

LEs processus coopèrent souvent pour traiter un même problème. Ces

MINIMUM. connaissances nécessaires à la programmation des microcontrôleurs PIC18 en langage C (une introduction au langage c A.N.S.

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

Programmer en JAVA. par Tama

Cours intensif Java. 1er cours: de C à Java. Enrica DUCHI LIAFA, Paris 7. Septembre Enrica.Duchi@liafa.jussieu.fr

Analyse de sécurité de logiciels système par typage statique

Plan du cours. Historique du langage Nouveautés de Java 7


Séance 0 : Linux + Octave : le compromis idéal

Algorithmique, Structures de données et langage C

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

Examen d informatique première session 2004

Algorithmique & Langage C IUT GEII S1. Notes de cours (première partie) cours_algo_lgc1.17.odp. Licence

INTRODUCTION A JAVA. Fichier en langage machine Exécutable

Mesure de performances. [Architecture des ordinateurs, Hennessy & Patterson, 1996]

Travaux pratiques. Compression en codage de Huffman Organisation d un projet de programmation

Utilisation d objets : String et ArrayList

Simulation d un système de paiement par carte bancaire

PROJET ALGORITHMIQUE ET PROGRAMMATION II

V- Manipulations de nombres en binaire

Les processus. Système L3, /39

INITIATION A LA PROGRAMMATION

as Architecture des Systèmes d Information

Programmation en langage C Eléments de syntaxe

1 Mesure de la performance d un système temps réel : la gigue

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

TP1 : Initiation à Java et Eclipse

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

ENSP Strasbourg (Edition ) Les Systèmes Temps Réels - Ch. DOIGNON. Chapitre 3. Mise en œuvre : signaux, gestion du temps et multi-activités

Bases Java - Eclipse / Netbeans

Le langage C. Introduction, guide de reference

Initiation. àl algorithmique et à la programmation. en C

Installation et compilation de gnurbs sous Windows

Projet d informatique M1BI : Compression et décompression de texte. 1 Généralités sur la compression/décompression de texte

Les processus légers : threads. Système L3, /31

Testez votre installation. Créer un répertoire vide

Projet L1, S2, 2015: Simulation de fourmis, Soutenance la semaine du 4 mai.

Conventions d écriture et outils de mise au point

Introduction à la programmation Travaux pratiques: séance d introduction INFO0201-1

Auto-évaluation Programmation en Java

Lier Erlang avec d autres langages de programmation

OS Réseaux et Programmation Système - C5

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

Langage Éric Guérin 5 octobre 2010

Environnements et Outils de Développement Cours 1 Introduction

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

TP, première séquence d exercices.

Programmation C. J.-F. Lalande. 15 novembre 2012

Chaîne de production d un programme

Table des matières. Chapitre 4 : Variables pointeurs

Titre: Version: Dernière modification: Auteur: Statut: Licence:

Langage et Concepts de ProgrammationOrientée-Objet 1 / 40

Transcription:

Introduction à Make et aux fonctions pseudo-aléatoires 1 Introduction à Make Support de TP C Make est un outil de programmation, dont une version est disponible pour les systèmes Unix sous la licence GNU (c est-à-dire libre à l utilisation, la copie et la redistribution). Il permet d automatiser des tâches, telles que la compilation de programmes ou l archivage de fichiers. Pour fonctionner, Make a besoin d un certain nombre d informations qu il cherchera par défaut dans un fichier nommé makefile ou Makefile (il est ainsi recommandé d utiliser ces noms de fichiers). Le but de cette section est de donner les informations nécessaires à la création de fichiers Makefile pour la compilation de projets C peu complexes. 1.1 Syntaxe Un fichier Makefile est constitué de plusieurs règles, chacune définie par la syntaxe suivante (une tabulation (tab) doit nécessairement précéder chaque commande) : cible1 : [dépendance1] [dépendance2]... (tab) [commande1] (tab) [commande2]... cible2 : [dépendancea] [dépendanceb]... (tab) [commandea] (tab) [commandeb]... La commande shell make cible1 entraîne l évaluation successive de chacune de ses dépendances (dépendance1, dépendance2, etc...). Pour une compilation par exemple, Make compare la date de modification de la cible avec celle de chaque dépendance : si au moins une dépendance s avère plus récente que la cible, les commandes de la cible (commande1, commande2, etc...) sont exécutées. 1

Si une dépendance est la cible d une autre règle du Makefile, cette cible est à son tout évaluée, et, si nécessaire, ses commandes sont exécutées avant celles de la cible originale. Par exemple, si dépendance2 est égale à cible2 (et si une dépendance de cible2 est plus récente que cible2), make cible1 entraînera l exécution successive des commandes commandea, commandeb, etc... puis commande1, commande2, etc... Si une cible ne contient pas de dépendance, ses commandes sont exécutées à chaque appel de la cible. Pour éviter d écrire de longues commandes ou une longue liste de dépendance sur la même ligne, on peut utiliser le caractère de continuation de ligne \. 1.2 Exemple simple On considère un programme etudiant_insa.c qui utilise les couples de fichiers (.c et.h) : traîner_sur_internet et manger_des_pâtes. Le fichier Makefile suivant permet de compiler l ensemble des fichiers par la commande shell make etudiant_insa. etudiant_insa : etudiant_insa.o \ traîner_sur_internet.o manger_des_pâtes.o (tab) gcc etudiant_insa.o traîner_sur_internet.o \ manger_des_pâtes.o -o etudiant_insa etudiant_insa.o : etudiant_insa.c (tab) gcc -c etudiant_insa.c traîner_sur_internet.o : traîner_sur_internet.c (tab) gcc -c traîner_sur_internet.c manger_des_pâtes.o : manger_des_pâtes.c (tab) gcc -c manger_des_pâtes.c 1.3 Cibles conventionnelles Les cibles default, all, clean et install se retrouvent couramment dans un Makefile. C est souvent une bonne idée de les implanter, lorsqu elles sont applicables (make install, par exemple, n est généralement pas nécessaire dans un TP). default : décrit les cibles évaluées et exécutées par la commande shell make appelée sans argument, all : réalise l ensemble des cibles décrites par le fichier Makefile (par exemple, compile l ensemble des fichiers d un projet C), clean : supprime les fichiers créés par l exécution de Make, par exemple pour repartir d un environnement propre (en C, make clean supprime généralement les fichiers objets et les exécutables) 2

install : installe une application ou un programme, idéalement au bon endroit (le problème vient souvent de ce que le bon endroit dépend du système qu on utilise). 1.4 Règles génériques Une règle générique ne mentionne pas de cibles particulières, mais porte sur un ensemble de cibles. En C, une règle générique permet généralement de décrire la compilation de fichiers sources.c en fichiers objets.o. Les variables automatiques $ et $< sont souvent utilisées pour cela : $ représente l ensemble des dépendances de la règle, et $< représente uniquement la première dépendance. $@ est une autre variable automatique souvent utilisée, représentant le nom de la cible dans une règle. Ci-dessous, un exemple de règle générique, créant les fichiers objets à partir des fichiers sources de même nom. La variable automatique % y est utilisé pour représenter la même valeur du côté de la cible et du côté des dépendances. %.o : %.c : (tab) gcc -c $< 1.5 Exemple plus concret de Makefile En reprenant le programme etudiant_insa et les fichiers dont il dépend traîner_sur_internet et manger_des_pâtes, on obtient : default : etudiant_insa all : etudiant_insa clean : (tab) rm *.o etudiant_insa etudiant_insa : etudiant_insa.o \ traîner_sur_internet.o manger_des_pâtes.o (tab) gcc etudiant_insa.o traîner_sur_internet.o \ manger_des_pâtes.o -o $@ %.o : %.c (tab) gcc -c $< traîner_sur_internet.o : traîner_sur_internet.h manger_des_pâtes.o : manger_des_pâtes.h 3

2 Fonctions pseudo-aléatoires Les ordinateurs et les programmes informatiques ont un comportement déterministes, et sont ainsi incapables de générer par eux-mêmes des nombres choisis aléatoirement. Pour résoudre partiellement ce problème, on utilise des générateurs pseudo-aléatoires, qui construisent une série de nombres pseudo-aléatoires à partir d une graine donnée. La même graine, utilisée plusieurs fois, donnera à chaque fois la même série de nombres pseudoaléatoires. De plus, à partir d une certaine quantité de nombres générés, la série de nombres devient prédicitble, et ne peut plus être considérée comme aléatoire. Malgré ces limites, la génération de nombres pseudoaléatoires reste un moyen simple et efficace pour introduire du (pseudo) hasard dans les systèmes informatiques. Cette section présente rapidement deux fonctions de la librairie standard C (stdlib) permettant de générer des nombres pseudo-aléatoires : rand et srand. 2.1 Les fonctions rand et srand La fonction void srand(unsigned int seed) a pour but d initialiser une série de nombres pseudo-aléatoires à partir de la graine seed passée en argument. La série pseudo-aléatoire utilisée par défaut, c est-à-dire quand la fonction srand n a pas été utilisée pour fournir une graine, a une graine de 1. Une fois la série pseudo-aléatoire initialisée par une graine, chaque appel de la fonction int rand() renvoie la valeur suivante dans la série. Cette valeur est comprise entre 0 et la valeur RAND_MAX définie dans stdlib. Pour avoir un nombre aléatoire compris entre 0 et 1, donc facilement assimilable a une probabilité, il suffit de diviser par RAND_MAX le nombre aléatoire retourné par rand(). Ces nombres étant de type integer, il est nécessaire de les forcer au type float pour ne pas se retrouver avec le résultat d une division entière. 2.2 Exemple d utilisation Le programme suivant affiche les 10 premiers nombres de la série pseudoaléatoire générée avec une graine de valeur 4, ainsi que les valeurs associées normées entre 0 et 1. Définir la valeur de la graine dans le programme, comme ici, n est généralement pas la démarche à suivre, puisque chaque exécution du programme donnera la même succession de nombres. # include <stdlib.h> # include <stdio.h> int main () { 4

int loop, random_number ; int seed = 4 ; float normed ; srand(seed) ; for (loop = 1 ; loop <=10 ; loop++) { random_number = rand() ; printf("%d : ", random_number) ; normed = (float) random_number / (float) RAND_MAX ; printf("%f\n", normed) ; return 0 ; 2.3 Comment choisir une graine? C est la question prinicpale dans l utilisation de rand et srand. Différentes solutions sont possibles. Sous Unix, on choisit généralement soit de prendre les microsecondes du temps courant (en utilisant la fonction gettimeofday), soit de prendre le pid du processus exécutant le programme (en utilisant la fonction getpid). Dans l exemple suivant, on choisit d utiliser la fonction int gettimeofday (struct timeval *tv, struct timezone *tz). Cette fonction prend en entrée deux structures par adresse : une struct timeval contenant les champs tv_sec et tv_usec (respectivement les secondes et les microsecondes du temps mis à jour par le système d exploitation), et une struct timezone, généralement obsolète, dont ici nous ne nous soucions pas. # include <stdlib.h> # include <stdio.h> # include <sys/time.h> int main () { int loop, random_number ; float normed ; struct timeval tv ; gettimeofday(&tv, NULL) ; srand(tv.tv_usec) ; for (loop = 1 ; loop <=10 ; loop++) { random_number = rand() ; printf("%d : ", random_number) ; normed = (float) random_number / (float) RAND_MAX ; printf("%f\n", normed) ; return 0 ; 5