Vous êtes sur la page 1sur 97

Introduction

Le plan Programmation C avanc


dition, programmation et mise au point dans le cas dun environnement Unix
1

Stphanie E VEN (Stephanie.Even@enstb.org) Serge G UELTON (Serge.Guelton@enstb.org) Ronan K ERYELL (Ronan.Keryell@hpc-project.com)


High Performance Computing Architecture and Security (HPCAS) Dpartement Informatique, TLCOM Bretagne E E & HPC Project

Avril 2009 1.25

Introduction Bibliographie Petite histoire Langage Gnralits Un ordinateur ? Mais quest-ce ? Les bases de la numrologie Calcul binaire Dclarations Gnralits Types des objets Porte Expressions Smantique oprateurs Coercition de type Instructions Prprocesseur Bibliothques

9 10 11 12

13

14

6 7 8

15 16 17

Modle mmoire & allocation Entres-sorties GNOME diteur exemple dEmacs Tuning de son clavier Compilation Modularisation Mise au point Dvermineur (debugger) Analyse mmoire Extensions Du C pour le graphisme C++ Dlires Le btisier Concours de programmes incomprhensibles Conclusion Index Table des matires

C avant C UV2 INF 446 TLCOM Bretagne/Info/HPCAS E E S. E VEN, S. G UELTON & R. K ERYELL 2 / 361

Introduction

Domaine

Introduction

Domaine

Domaine dutilisation

(I)

Pourquoi un cours de C ?
Utilis dans de nombreux projets Fait partie de linconscient collectif informatique

(I)

Langage spectre large port sur toutes les applications


Supercalculateurs parallles avec 10 000 106 processeurs Micro-contrleurs (proche du matriel) Systmes dexploitation Synthse architecturale (SpecC, SystemC)

Langage informatique servant de base de nombreux autres langages Nombreux langages dnis par rapport au C (C++, Java, C#, ObjectiveC, UPC, OpenCL, Cg, CUDA, Brook+, CTM, OpenCL, SystemC, SpecC, HandelC, HyperC, PompC, csh...)

De nombreuses bibliothques pour faire des choses de haut niveau


Algorithmique et structures de donnes WWW Composants mtiers

De nombreux autres domaines de lENST Bretagne impliquent des connaissance en C


Traitement du signal Analyse dimage lectronique

Projet coupe de robotique (E=M6) difcile par le pass car peu dlves ayant fait du C dans la vraie vie But subliminal du cours : former lquipe E=M6 ! Ddicace spciale Cline et son port parallle
C avant C UV2 INF 446 TLCOM Bretagne/Info/HPCAS E E S. E VEN, S. G UELTON & R. K ERYELL 3 / 361 C avant C UV2 INF 446 TLCOM Bretagne/Info/HPCAS E E S. E VEN, S. G UELTON & R. K ERYELL 4 / 361

Introduction

Domaine

Introduction

Domaine

Pourquoi un cours de C ?

(II)

De nombreuses extensions

(I)

Un langage vivant Extensions orientes objet (C++, Objective C) Programmation parallle (UPC, OpenMP) Ce cours prsuppose connaissance dun langage informatique ! Cg, CUDA (cartes graphiques de nVidia), Brook+, CTM (AMD-ATI), OpenCL Extensions ad-hoc ou utilisation de classes ? ... et des restrictions sur du matriel rduit Micro-contrleurs (pas de float, double...) 808880386 (far, near...) DSP

C avant C UV2 INF 446 TLCOM Bretagne/Info/HPCAS E E S. E VEN, S. G UELTON & R. K ERYELL 5 / 361

C avant C UV2 INF 446 TLCOM Bretagne/Info/HPCAS E E S. E VEN, S. G UELTON & R. K ERYELL 6 / 361

Introduction

Domaine

Introduction

Domaine

Problmatique pdagogique

(I)

Htrognit des lves

(I)

Apprendre progressivement tout un langage et environnement de dveloppement


De nombreuses interdpendances de concepts Oblig de faire un enseignement en largeur dabord

Parcours de plus en plus htrognes cause (grce) aux rformes de lenseignement (semestrialisation et optionalit) et la varit des recrutements Phnomne aggrav grce la pntration culturelle de linformatique la maison Comment faire le grand cart entre des dbutants et des conrms en langage C ? Gageure : arriver intresser les 2 publics Plus quun cours de C : faire passer une culture informatique Pas de petites classes mais il faut des lves actifs !

Test un concept nouveau : le parcours pdagogique de lexpos nest pas forcment celui des transparents Effets de bord positifs Tient les lves en haleine car doivent faire des sauts de pages plus complexes Muscle plus les doigts

C avant C UV2 INF 446 TLCOM Bretagne/Info/HPCAS E E S. E VEN, S. G UELTON & R. K ERYELL 7 / 361

C avant C UV2 INF 446 TLCOM Bretagne/Info/HPCAS E E S. E VEN, S. G UELTON & R. K ERYELL 8 / 361

Introduction

Bibliographie

Introduction

Bibliographie

Le plan
1

Ressources & Bibliographie


Modle mmoire & allocation Entres-sorties GNOME diteur exemple dEmacs Tuning de son clavier Compilation Modularisation Mise au point Dvermineur (debugger) Analyse mmoire Extensions Du C pour le graphisme C++ Dlires Le btisier Concours de programmes incomprhensibles Conclusion Index Table des matires

(I)

2 3

Introduction Bibliographie Petite histoire Langage Gnralits Un ordinateur ? Mais quest-ce ? Les bases de la numrologie Calcul binaire Dclarations Gnralits Types des objets Porte Expressions Smantique oprateurs Coercition de type Instructions Prprocesseur Bibliothques

Axiome
Ce support de prsentation est cliquable Livres
Mthodologie de la programmation en C : norme C 99 - API POSIX , Achille Braquelaire , 4me dition, Dunod, 2005 Sciences Sup Programmation avance en C (avec exercices et corrigs) , Sbastien Varrette et Nicolas Bernard, fvrier 2007, Hermes Science Publication http://www-id.imag.fr/~svarrett/cours.html#poly_C

9 10 11 12

13

14

6 7 8

15 16 17

http://cslibrary.stanford.edu Explications sur plein de concepts informatiques, dont un lm en pte modeler sur les pointeurs

C avant C UV2 INF 446 TLCOM Bretagne/Info/HPCAS E E S. E VEN, S. G UELTON & R. K ERYELL 9 / 361

C avant C UV2 INF 446 TLCOM Bretagne/Info/HPCAS E E S. E VEN, S. G UELTON & R. K ERYELL 10 / 361

Introduction

Bibliographie

Introduction

Bibliographie

Ressources & Bibliographie


http://www.laas.fr/~matthieu/cours/c-superflu Guide superu de programmation en langage C Matthieu H ERRB, exgse de quelques chausse-trappes

(II)

Ressources & Bibliographie

(III)

http://www-clips.imag.fr/commun/bernard.cassagne/Introduction_ANSI_C.html

http://www.gnu.org/software/make/manual gestion de projet Make http://www.gnu.org/software/gdb/documentation dbogueur http://www.gnu.org/software/ddd/manual dbogueur graphique http://www.gnu.org/software/emacs/manual

http://www-inf.int-evry.fr/COURS/CTOUTMOD cours interactif sur C et Emacs http://picolibre.int-evry.fr/projects/coursc Cours plus complet Documentation info sur GNU, GCC, Emacs,... : taper C-h i dans Emacs La mme chose en ligne sur http://www.gnu.org/manual/
http://gcc.gnu.org/onlinedocs compilateurs http://www.gnu.org/software/libc/manual bibliothque standard du C
C avant C UV2 INF 446 TLCOM Bretagne/Info/HPCAS E E S. E VEN, S. G UELTON & R. K ERYELL 11 / 361

http://en.wikipedia.org/wiki/C_(programming_language) http://en.wikipedia.org/wiki/C99 FAQ (foires aux questions) Ingnirie par moteur de recherche : envoyer messages derreur dans le moteur http://www.open-std.org/JTC1/SC22/WG14
http://www.open-std.org/JTC1/SC22/WG14/www/docs/n1256.pdf

Use the source, Luke... en 552 pages

C avant C UV2 INF 446 TLCOM Bretagne/Info/HPCAS E E S. E VEN, S. G UELTON & R. K ERYELL 12 / 361

Introduction

Bibliographie

Introduction

Petite histoire

Monitorat

Le plan
1

Le monitorat lENST Bretagne le soir !


En monitorat tu iras !
2 3

Le monitorat lENST Bretagne le soir !


En monitorat tu iras !
4

Theorem
Le monitorat lENST Bretagne le soir ! En monitorat tu iras !
6 7 8
C avant C UV2 INF 446 TLCOM Bretagne/Info/HPCAS E E S. E VEN, S. G UELTON & R. K ERYELL 13 / 361

Introduction Bibliographie Petite histoire Langage Gnralits Un ordinateur ? Mais quest-ce ? Les bases de la numrologie Calcul binaire Dclarations Gnralits Types des objets Porte Expressions Smantique oprateurs Coercition de type Instructions Prprocesseur Bibliothques

9 10 11 12

13

14

15 16 17

Modle mmoire & allocation Entres-sorties GNOME diteur exemple dEmacs Tuning de son clavier Compilation Modularisation Mise au point Dvermineur (debugger) Analyse mmoire Extensions Du C pour le graphisme C++ Dlires Le btisier Concours de programmes incomprhensibles Conclusion Index Table des matires

C avant C UV2 INF 446 TLCOM Bretagne/Info/HPCAS E E S. E VEN, S. G UELTON & R. K ERYELL 14 / 361

Introduction

Petite histoire

Introduction

Petite histoire

Prhistoire

(I)

C & Unix Story


En attendant la suite, Ken T HOMSON de BTL crit un jeu Space Travel quil fait tourner sur un PDP-7 (machine pas trop chre)

(I)

Projet MULTICS : MULTiplexed Information and Computing Service MIT, Bell Telephone Laboratories de AT&T, General Electric Offrir puissance de calcul pour toute la ville de Boston : le Minitel avant lheure Notion de Computer Grid (qui revient de nos jours...) Plus difcile que prvu dans la communaut abandonn mais grande inuence

http://en.wikipedia.org/wiki/PDP-7

Problme : pas denvironnement de dveloppement sur PDP-7 et ncessit de faire de lassemblage crois sur Honeywell 635 roulant GECOS Machine de 32K mots de 18 bits : un microcontrleur de nos jours ! Pour faciliter le dveloppement du jeu, dveloppement dun systme dexploitation pour le PDP-7 : systme de chier simple (s5fs), systme de gestion de processus, interprteur de commande (shell). Dvelopp en assembleur (langage machine) Le systme devient auto-sufsant et est nomm Unix en 1969, jeu de mots (eunuchs) aussi en opposition Multics

encore sous forme de secte http://www.multicians.org

C avant C UV2 INF 446 TLCOM Bretagne/Info/HPCAS E E S. E VEN, S. G UELTON & R. K ERYELL 15 / 361

C avant C UV2 INF 446 TLCOM Bretagne/Info/HPCAS E E S. E VEN, S. G UELTON & R. K ERYELL 16 / 361

Introduction

Petite histoire

Introduction

Petite histoire

C & Unix Story


Portage dUnix sur PDP-11 et dveloppement de lditeur de texte ed et du systme de composition de texte runoff Dveloppement du langage interprt B utilis pour dvelopper les outils Dennis R ITCHIE fait voluer le langage en C dont le succs a largement dpass le cadre dUnix 1972 : 10 machines sous Unix... Unix rcrit en C en 1973 et la distribution version 4 contient elle-mme cc
Simple & facile assimiler Langage proche de la machine (pour systme dexploitation) Macro-assembleur
Gestion explicite de la mmoire Pointeurs Optimisation manuelle possible

(II)

C & Unix Story


Structures de donnes complexes Portabilit

(III)

Prprocesseur Portabilit Adaptabilit diffrents contextes et styles de programmation imprative

Luniversit de Berkeley rcupre une licence (gratuite cause dun procs antitrust de 1956 entre AT&T et Western Electric Company) Travaux SRI de Doug E NGELBART sur interfaces graphiques dans les annes 1960 repris ensuites chez Xerox PARC La version 7 de 1979 est la premire version rellement portable Beaucoup damliorations fournies par les utilisateurs eux-mmes (de mme que BSD & Linux maintenant) favoris par le ct non commercial
C avant C UV2 INF 446

Mais avec des caractristiques de langage de haut niveau


C avant C UV2 INF 446 TLCOM Bretagne/Info/HPCAS E E S. E VEN, S. G UELTON & R. K ERYELL 17 / 361

TLCOM Bretagne/Info/HPCAS E E

S. E VEN, S. G UELTON & R. K ERYELL

18 / 361

Introduction

Petite histoire

Introduction

Petite histoire

C & Unix Story

(IV)

C & Unix Story


1982 : loi antitrust qui clate AT&T en baby-Bell dont le AT&T Bell Laboratories qui peut alors commercialiser Unix
1982 : System III 1983 : System V 1984 : System V release 2 (SVR2) 1987 : System V release 3 (SVR3) introduit les IPC (InterProcess Communications : mmoire partage, smaphores), les STREAMS, le Remote File Sharing, les bibliothques partages,... Base de nombreux Unix commerciaux

(V)

MicroSoft et Santa Cruz Operation collabore sur un portage pour i8086 : Xenix Portage sur machine 32 bits (Vax-11) en 1978 : UNIX/32V qui est rcupre par Berkeley (http://www.lpl.arizona.edu/~vance/www/vaxbar.html VaxBar) 1978, publication de The C Programming Language dcrivant le C version K&R (Brian K ERNIGHAN & Dennis R ITCHIE) Rajout dutilitaires (csh de Bill Joy) et dun systme de pagination La DARPA donne un contrat Berkeley pour implmenter IP : BSD
Dernire version en 1993 : 4.4BSD. En tout : apport des socket, dIP, dun fast le system (FFS), des signaux robustes, la mmoire virtuelle Socit BSDI cre pour vendre 4.4BSD lite en 1994, dbarrass de tout code dorigine AT&T
C avant C UV2 INF 446 TLCOM Bretagne/Info/HPCAS E E S. E VEN, S. G UELTON & R. K ERYELL 19 / 361

1982 : Bill Joy quitte Berkeley pour fonder Sun Microsystems. Adaptation de 4.2BSD en SunOS qui introduit le Network File System, interface de systme de chier gnrique, nouveau mcanisme de gestion mmoire Langage C standardis par lISO en 1989 (ISO/IEC 9899 :1990) Nouvelle version en 1999 : C99 (ISO/IEC 9899 :1999)
http://www.open-std.org/JTC1/SC22/WG14/www/C99RationaleV5.10.pdf
C avant C UV2 INF 446 TLCOM Bretagne/Info/HPCAS E E S. E VEN, S. G UELTON & R. K ERYELL 20 / 361

Introduction

Petite histoire

Introduction

Petite histoire

C & Unix Story


Commence tre bien rpandue dans les compilateurs Normalisation en parallles dun UNIX abstrait, POSIX (Portable Operating System Interface for uniX)
http://en.wikipedia.org/wiki/POSIX Dnit des concepts en abstractions (processus, chiers...) Interface normalis de programmation
API (Application Programming Interface) Commandes shell et autres Communications rseau et interprocessus Temps rel

(VI)

C & Unix Story

(VII)

diteur Emacs A facilit le dveloppement de systmes dexploitations complets style Linux

Dpasse le cadre dUNIX : dautres systmes peuvent offrir une mme interface sans avoir les concepts en natif : Windows, Mac OS X...

Projet GNU pouss par Richard S TALLMAN de la FSF pour dvelopper des programmes libres de type POSIX
Toutes les commandes classiques UNIX Compilateur C portable & reciblable gcc et pour dautres langages
C avant C UV2 INF 446 TLCOM Bretagne/Info/HPCAS E E S. E VEN, S. G UELTON & R. K ERYELL 21 / 361 C avant C UV2 INF 446 TLCOM Bretagne/Info/HPCAS E E S. E VEN, S. G UELTON & R. K ERYELL 22 / 361

Introduction

Petite histoire

Langage

Notations typographiques utilises dans ce cours (I)

Le plan
1

Les blancs (napparaissant pas...) sont typographis de manire A visible (merci LTEX avec le style listings ! )
3 jolies espaces 2 tabulations

2 3

Pas la peine de chercher ces caractres graphiques sur votre clavier ni de les crire sur les copies dexamen Mot cl du langage gotobed Commentaires /Commeenterre/ Chanes de caractres "chnedecaractre"

Introduction Bibliographie Petite histoire Langage Gnralits Un ordinateur ? Mais quest-ce ? Les bases de la numrologie Calcul binaire Dclarations Gnralits Types des objets Porte Expressions Smantique oprateurs Coercition de type Instructions Prprocesseur Bibliothques

9 10 11 12

13

14

6 7 8
C avant C UV2 INF 446 TLCOM Bretagne/Info/HPCAS E E S. E VEN, S. G UELTON & R. K ERYELL 23 / 361

15 16 17

Modle mmoire & allocation Entres-sorties GNOME diteur exemple dEmacs Tuning de son clavier Compilation Modularisation Mise au point Dvermineur (debugger) Analyse mmoire Extensions Du C pour le graphisme C++ Dlires Le btisier Concours de programmes incomprhensibles Conclusion Index Table des matires

C avant C UV2 INF 446 TLCOM Bretagne/Info/HPCAS E E S. E VEN, S. G UELTON & R. K ERYELL 24 / 361

Langage

Gnralits

Langage

Gnralits

Le plan
1

Des instructions et expressions C...


Modle mmoire & allocation Entres-sorties GNOME diteur exemple dEmacs Tuning de son clavier Compilation Modularisation Mise au point Dvermineur (debugger) Analyse mmoire Extensions Du C pour le graphisme C++ Dlires Le btisier Concours de programmes incomprhensibles Conclusion Index Table des matires

(I)

2 3

Introduction Bibliographie Petite histoire Langage Gnralits Un ordinateur ? Mais quest-ce ? Les bases de la numrologie Calcul binaire Dclarations Gnralits Types des objets Porte Expressions Smantique oprateurs Coercition de type Instructions Prprocesseur Bibliothques

Ordinateur excute des instructions qui interagissent avec des donnes Ensemble ordonn dinstructions et de donnes programme Instructions en C constitues dexpressions
1 2

9 10 11 12

a=4 ; c = d[i] ;

13

14

Denition
Une instruction C est une expression termine par un ; Expressions rcursivement composes dexpressions
1

6 7 8

15 16 17

b = 3 + 4* cos ( x );

C avant C UV2 INF 446 TLCOM Bretagne/Info/HPCAS E E S. E VEN, S. G UELTON & R. K ERYELL 25 / 361

C avant C UV2 INF 446 TLCOM Bretagne/Info/HPCAS E E S. E VEN, S. G UELTON & R. K ERYELL 26 / 361

Langage

Gnralits

Langage

Gnralits

Des instructions et expressions C...

(II)

... en passant par les fonctions C...


Rassemble instructions de manire modulaire Prennent ventuellement des paramtres Fonctions dnies par des utilisateurs Fonctions standard

(I)

Regroupement possible dinstructions dans un bloc entre { et }

Mathmatique : cos(x) Entres/sorties, systme,... : exit(0) Sens de lconomie du C : pas dinstructions spciques pour faire des entres-sorties
Pas de PRINT la Fortran, Basic, PERL, Python Utilise des fonctions externes optionnelles Simplie le langage Permet une adquation avec les besoins

Algorithmique et structures de donnes : strdup(chaine) ...

Sens de lconomie du C : une procdure ou une sous-routine est une fonction qui ne renvoie rien
C avant C UV2 INF 446 TLCOM Bretagne/Info/HPCAS E E S. E VEN, S. G UELTON & R. K ERYELL 27 / 361 C avant C UV2 INF 446 TLCOM Bretagne/Info/HPCAS E E S. E VEN, S. G UELTON & R. K ERYELL 28 / 361

Langage

Gnralits

Langage

Gnralits

... en passant par les fonctions C...

(II)

... aux programmes C

(I)

Sens de lconomie du C : pas de prcision par mot clef style PROGRAM de Fortran
Pas besoin dinstruction dappel particulire (CALL en Fortran ou Basic) Subliminal : doit avoir un effet de bord pour servir quelque chose (par exemple entre/sortie)

Denition
Un programme C est une fonction de nom main() qui prend des arguments textuels en paramtre et renvoie un code de retour derreur entier Systme dexploitation fournit arguments de ligne de commande comme paramtres

C avant C UV2 INF 446 TLCOM Bretagne/Info/HPCAS E E S. E VEN, S. G UELTON & R. K ERYELL 29 / 361

C avant C UV2 INF 446 TLCOM Bretagne/Info/HPCAS E E S. E VEN, S. G UELTON & R. K ERYELL 30 / 361

Langage

Gnralits

Langage

Gnralits

Programme minimal en C

(I)
1

Programme hello world en C


/ Pour p o u v o i r u t i l i s e r proprement l a f o n c t i o n de s o r t i e : / # i n c l u d e < stdio .h > / D f i n i t e n t r e a u t r e s l e s c ode s de r e t o u r : / # i n c l u d e < stdlib .h > i n t main ( i n t argc , char * argv []) { / A f f i c h e s u r l a s o r t i e s t a n d a r d / puts ( " H e l l o , w o rl d ! " ); // Renvoie une marque de r u s s i t e : r e t u r n EXIT_SUCCESS; }

(I)

7 1 2

i n t main ( i n t argc , char * argv []) { r e t u r n 0; }

11

Dans la ligne de tous les Hello World en plein de langages


http://en.wikipedia.org/wiki/Hello_world#C

Lieu de lafchage dpend du contexte : terminal, imprimante, courriel, page WWW, nant... Fin optimiste...
C avant C UV2 INF 446 TLCOM Bretagne/Info/HPCAS E E S. E VEN, S. G UELTON & R. K ERYELL 31 / 361 C avant C UV2 INF 446 TLCOM Bretagne/Info/HPCAS E E S. E VEN, S. G UELTON & R. K ERYELL 32 / 361

Est-ce que lafchage a vraiment eu lieu ?

Langage

Gnralits

Langage

Gnralits

Commentaires

(I)

Vers un programme excutable

(I)

Penser A LZHEIMER qui nous guette... Ne pas surcommenter non plus (surtout avec des commentaires faux ) Permet aussi de momentanment ter des bouts de programme Tout texte (multi-ligne) entre /* et */ Ne sont pas rcursif ! /Commentaire/Jinsiste/ehnon!*/ Lignes commenant par // : arriv dans C99 par culture C++ & Java

Ordinateur incapable dexcuter instructions de haut niveau compilation en instructions machine Prprocesseur : gre dans code source les #quelque-choses, code source expans macro-instructions... Compilateur : traduit source expans en langage dassemblage (instructions machines) Assembleur : traduit langage dassemblage en instructions binaires excutables (code objet ) diteur de lien : tisse programme excutable dnitif partir de plusieurs chiers codes objet (bibliothques de fonctions standard, de dmarrage de main(), etc)

C avant C UV2 INF 446 TLCOM Bretagne/Info/HPCAS E E S. E VEN, S. G UELTON & R. K ERYELL 33 / 361

C avant C UV2 INF 446 TLCOM Bretagne/Info/HPCAS E E S. E VEN, S. G UELTON & R. K ERYELL 34 / 361

Langage

Gnralits

Langage

Gnralits

Compilation dun programme

(I)

Compilation dun programme

(II)

Et si on retape make ? Appel du compilateur en direct rapidement compliqu Utilisation doutils tels que make de gestion des phases de compilation partir dun Makefile de conguration Utiliser si possible les comportements par dfaut (sans Makefile par exemple ! )
1 2 1 2 4

$ make h e l l o _ w o r l d make : h e l l o _ w o r l d e s t j o u r . $ l s l rwxrxrx 1 k e r y e l l k e r y e l l 6918 20051012 22:03 h e l l o _ w o r l d rwr r 1 k e r y e l l k e r y e l l 320 20051012 21:44 h e l l o _ w o r l d . c

$ make hello_wor ld cc hello_wor ld . c -o hello_wor l d $ ./ hello_wor ld Hello , world !

make fait de la compilation paresseuse : compiler que ce qui est ncessaire Indispensable pour de gros projets ! viter de prendre un nom de commande qui existe dj... test.c

C avant C UV2 INF 446 TLCOM Bretagne/Info/HPCAS E E S. E VEN, S. G UELTON & R. K ERYELL 35 / 361

C avant C UV2 INF 446 TLCOM Bretagne/Info/HPCAS E E S. E VEN, S. G UELTON & R. K ERYELL 36 / 361

Langage

Gnralits

Langage

Gnralits

Dclarer des fonctions


Entte : dclare nom, paramtres et types associs et type de valeur retourne Corps de la fonction : calcul faire Excution sarrte sur return avec ventuellement valeur de retour On peut remplacer tout appel dune fonction par corps de fonction en rajoutant inline devant dclaration de fonction
Gain ventuel en vitesse Augmentation taille de programme
1 2

(I)

Dclarer des fonctions

(II)

1 2

/ Ne r e n v o i e r i e n : une pr oc du r e en f a i t / v o id begin_ti me r ( v o id / Pas d argument / ) { g e t t i m e o f d a y (& time_begin , NULL ); }

10

/ r e t u r n t h e e l a p s e d t i m e i n s e c on ds s i n c e t h e l a s t b e g i n _ t i m e r ( ) : / double end_timer ( v o id ) { double run_time ; g e t t i m e o f d a y (& time_end , NULL ); / Take c ar e o f t h e nona s s o c i a t i v i t y i n f l o a t i n g p o i n t : ) / run_time = time_end . tv_sec - time_begin . tv_sec + ( time_end . tv_usec - time_begin . tv_usec )/1 e6 ; r e t u r n run_time ; }

C avant C UV2 INF 446 TLCOM Bretagne/Info/HPCAS E E S. E VEN, S. G UELTON & R. K ERYELL 37 / 361

C avant C UV2 INF 446 TLCOM Bretagne/Info/HPCAS E E S. E VEN, S. G UELTON & R. K ERYELL 38 / 361

Langage

Gnralits

Langage

Gnralits

Dclarer des fonctions

(III)

Types et expressions

(I)

double a s s u r a n c e _ m e n s u e l l e ( double montant , double taux ) { / Le t a u x e s t un p o u r c e n t a g e par an s u r l e montant t o t a l du p r t . / r e t u r n montant * taux /12; }

Valeur dexpression calcule partir dun oprateur et des valeurs doprandes Une valeur a un type qui dnit son domaine de validit
Boolen : la base de la vrit vraie true&false (false) Nombre entier : sous-ensemble ni de 2/3 (0) Nombre ottant : sous-ensemble ni de 2/3 ( 0,6666 ) Des chanes de caractres
"commececi"

Plein dautres types plus compliqus ou dnis par le programmeur...

C avant C UV2 INF 446 TLCOM Bretagne/Info/HPCAS E E S. E VEN, S. G UELTON & R. K ERYELL 39 / 361

C avant C UV2 INF 446 TLCOM Bretagne/Info/HPCAS E E S. E VEN, S. G UELTON & R. K ERYELL 40 / 361

Langage

Gnralits

Langage

Gnralits

Variables et dclaration

(I)

Variables et dclaration

(II)

Entits capables de stocker des valeurs ou objets Dclarations ncessaires avant usage contrairement dautres langages et du style type nom ; type nom = valeur_initiale; Avant C99 : variables quen dbut de bloc dinstructions Culture C++ & Java C99 : distribution des dclarations comme on veut Dclarer l o cest le plus clair En C99 possibilit davoir des valeurs initiales non connues lors de la compilation
foo ( f l o a t f , f l o a t g ) { f l o a t beat_freq s [2] = { f - g , f + g }; / . . . / }

1 2

C avant C UV2 INF 446 TLCOM Bretagne/Info/HPCAS E E S. E VEN, S. G UELTON & R. K ERYELL 41 / 361

C avant C UV2 INF 446 TLCOM Bretagne/Info/HPCAS E E S. E VEN, S. G UELTON & R. K ERYELL 42 / 361

Langage

Gnralits

Langage

Gnralits

Affectation de variables

(I)

Visibilit des variables

(I)

Utilisation de loprateur (
1

pas de linstruction...) =

Variables globales
Dnie en dehors dun bloc dinstruction 2 sortes de visibilits :
Dnie globalement pour toutes les units de compilation Dnie globalement un seul chier (unit de compilation)

a = 3; d = ( c = e / f ) * 2;

Oprateur qui renvoie valeur affecte (pas adresse), donc quivalent


1 2

c=e/f; d = c * 2;

Variables locales
Dnie dans bloc dinstructions Dans une fonction : idem (cas particulier de bloc)

C avant C UV2 INF 446 TLCOM Bretagne/Info/HPCAS E E S. E VEN, S. G UELTON & R. K ERYELL 43 / 361

C avant C UV2 INF 446 TLCOM Bretagne/Info/HPCAS E E S. E VEN, S. G UELTON & R. K ERYELL 44 / 361

Langage

Gnralits

Langage

Gnralits

Visibilit des variables

(II)

La vie est un long euve tranquille

(I)

Paramtre de fonction
Cas particulier de variable locale Valeur copie de la valeur dappel de la fonction Passage de paramtre par valeur ou recopie si on modie dans la fonction le paramtre cela ne modie par la valeur dappel Le contraire du langage Fortran

Flot dinstructions toujours squentiel


Applications orientes ux de donnes, pipeline Traitement du signal, rendu de pixels dans cartes graphiques... ...mais bien trop limitatif dans cas gnral

Besoin davoir du contrle de ot pour varier cours excution


Instructions conditionnelles Boucles Sauts

C avant C UV2 INF 446 TLCOM Bretagne/Info/HPCAS E E S. E VEN, S. G UELTON & R. K ERYELL 45 / 361

C avant C UV2 INF 446 TLCOM Bretagne/Info/HPCAS E E S. E VEN, S. G UELTON & R. K ERYELL 46 / 361

Langage

Gnralits

Langage

Gnralits

Tests

(I)

Boucle tant que

(I)

Excute de manire conditionnelle 1 branche parmi 1 ou 2


1 2

i f ( condition ) instruction_excute_si_vrai else instruction_excute_si_faux

Itration sur condition vraie


1 2

w h i l e ( condition ) instruction_corps_de_boucle__faire

La partie else est optionnelle


1 2

Variante avec condition teste seulement la n ( moins excut au moins une fois)
1 2

corps au

i f ( a > b ) max = a ; e l s e { max = b ; echange = 1; }

do instruction_corps_de_boucle__faire_au_moins_une_fois w h i l e ( condition );

C avant C UV2 INF 446 TLCOM Bretagne/Info/HPCAS E E S. E VEN, S. G UELTON & R. K ERYELL 47 / 361

C avant C UV2 INF 446 TLCOM Bretagne/Info/HPCAS E E S. E VEN, S. G UELTON & R. K ERYELL 48 / 361

Langage

Gnralits

Langage

Gnralits

Boucle pour

(I)

Bien prsenter les programmes


tre capable de lire (rapidement !) son programme... et ceux des autres ! Important si travail collaboratif Langage C pas orient ligne (sauf prprocesseur)
Source de guerre de religions entre langages Fortraneux : trouvent idiot quen C on doive mettre des ; C et perl : trouvent idiot quen Fortran on soit assez prisonnier des lignes Pythoneux : pensent que la syntaxe doit reter la prsentation (et rciproquement)

(I)

Sucre syntaxique de la boucle while permettant (par exemple) de grer des indices de boucle
1 2

f o r ( expression_initiale ; expression_de_test; expression_avant_rebouclage ) i n s t r u c t i o n _ c o r p s _de_boucl e

1 2 4 6

f o r ( i = 0 ; i < number_of_skewing ; i ++) { f o r ( j = 0 ; j < s i z e ; j ++) p o i n t e r s _ t o _ f i n g e r s [ j ] = ( i n t ) ( ( i n t ) ( drand48 ( ) s i z e ) si z eo f ( i n t ) ) ; t e s t e r r e u r ( "Unableto write pointer f i l e random\"%s\"" , w r i t e ( fd , ( char )& p o i n t e r s _ t o _ f i n g e r s [ 0 ] , buf . s t _ s i z e ) buf . s t _ s i z e , name ) ; }

On peut faire cryptique... des concours

Mais on peut utiliser la souplesse du C pour faire joli Diffrentes coles (style BSD, Linux...) Sadapter en fonction des projets

C avant C UV2 INF 446 TLCOM Bretagne/Info/HPCAS E E S. E VEN, S. G UELTON & R. K ERYELL 49 / 361

C avant C UV2 INF 446 TLCOM Bretagne/Info/HPCAS E E S. E VEN, S. G UELTON & R. K ERYELL 50 / 361

Langage

Gnralits

Langage

Gnralits

Bien prsenter les programmes

(II)

Rgle de base
Un caractre dans un chier cote 1,5 1010 2008 Ne pas hsiter rajouter des sauts de lignes, des espaces paisses... Quelques possibilits
Une dclaration de variable par ligne Une instruction lmentaire (pas bloc) par ligne Structure de contrle : dbut de ligne Accolade ouvrante : n de ligne Accolade fermante : seule sur une ligne tiquette : seule sur une ligne

(I)

diteurs de textes (les vrais aider la prsentation

) et autres IDE la rescousse pour

Outils souvent trs congurables WordPad, textedit et consorts ne sont pas des diteurs de textes pour faire la programmation ! ! !

Comme toutes les rgles, juste des ides adapter Dans le cadre dun projet, dune entreprise,... se mettre daccord car mlange de style pnible !

C avant C UV2 INF 446 TLCOM Bretagne/Info/HPCAS E E S. E VEN, S. G UELTON & R. K ERYELL 51 / 361

C avant C UV2 INF 446 TLCOM Bretagne/Info/HPCAS E E S. E VEN, S. G UELTON & R. K ERYELL 52 / 361

Langage

Gnralits

Langage

Gnralits

Indentation

(I)

Indentation
1 3

(II)

Ide : utiliser des espaces en tte de ligne pour faire ressortir localit/modularit/hirarchie des structure Intrt du concept : portabilit de cette prsentation en dehors de son propre diteur ou IDE Caractre tabulation interprt diffremment selon les systmes et conguration
Souvent tabulation 8 espaces Tabulations pouvant tre des dplacements des positions xes (ex. multiple de 8) Perso : tabulations de 4 Quid si mlange de diffrents styles ?

s t a t i c void s k e w _ t h e _ f i l e ( i n t number_of_skewing , char name ) { i n t fd , i , j , skew , size_end , s i z e_begi n , s i z e ; s t r u c t s t a t buf ; p o i n t e r s _ t o _ f i n g e r s = ( i n t ) mal l oc ( buf . s t _ s i z e ) ;

5 7

s i z e = buf . s t _ s i z e / si z eo f ( i n t ) ;
9 11 13 15 17 19 21 23

i f ( random_pointers ) { f o r ( i = 0 ; i < number_of_skewing ; i ++) { f o r ( j = 0 ; j < s i z e ; j ++) p o i n t e r s _ t o _ f i n g e r s [ j ] = ( i n t ) ( ( i n t ) ( drand48 ( ) s i z e ) si z eo f ( i n t ) ) ; t e s t e r r e u r ( "Unabletowrite pointer f i l e random\"%s\"" , w r i t e ( fd , ( char )& p o i n t e r s _ t o _ f i n g e r s [ 0 ] , buf . s t _ s i z e ) buf . s t _ s i z e , name ) ; } } else i f ( z e r o _ p o i n t e r s ) { f o r ( i = 0 ; i < number_of_skewing ; i ++) { f o r ( j = 0 ; j < s i z e ; j ++) p o i n t e r s _ t o _ f i n g e r s [ j ] = NULL ; t e s t e r r e u r ( "Unabletowrite pointer f i l e random\"%s\"" , w r i t e ( fd , ( char )& p o i n t e r s _ t o _ f i n g e r s [ 0 ] , buf . s t _ s i z e )

C avant C UV2 INF 446 TLCOM Bretagne/Info/HPCAS E E S. E VEN, S. G UELTON & R. K ERYELL 53 / 361

C avant C UV2 INF 446 TLCOM Bretagne/Info/HPCAS E E S. E VEN, S. G UELTON & R. K ERYELL 54 / 361

Langage

Gnralits

Langage

Gnralits

Indentation
25 27 29 31 33 35 37 39 41 43 45 47

(III)

Indentation

(IV)

buf . s t _ s i z e , name ) ; } } else { t e s t e r r e u r ( "Unabletoread pointer f i l e \"%s\"" , read ( fd , ( char ) p o i n t e r s _ t o _ f i n g e r s , buf . s t _ s i z e ) buf . s t _ s i z e , name ) ; /The f i l e size i s multipliedbynumber_of_skewing: / f o r ( i = 1 ; i < number_of_skewing ; i ++) { skew = i % ( buf . s t _ s i z e / si z eo f ( i n t ) ) ; size_end = skew si z eo f ( i n t ) ; s i z e_begi n = buf . s t _ s i z e size_end ; t e s t e r r e u r ( "Unabletowrite pointer f i l e begin\"%s\"" , w r i t e ( fd , ( char )& p o i n t e r s _ t o _ f i n g e r s [ skew ] , s i z e_begi n ) s i z e_begi n , name ) ; t e s t e r r e u r ( "Unabletowrite pointer f i l e end\"%s\"" , w r i t e ( fd , ( char )& p o i n t e r s _ t o _ f i n g e r s [ 0 ] , size_end ) size_end , name ) ; } } t e s t e r r e u r ( "Unableto c l o se pointer f i l e \"%s\"" , c l os e ( f d ) , name ) ; }

Encore : dans le cadre dun projet, dune entreprise,... se mettre daccord car mlange de style pnible !

C avant C UV2 INF 446 TLCOM Bretagne/Info/HPCAS E E S. E VEN, S. G UELTON & R. K ERYELL 55 / 361

C avant C UV2 INF 446 TLCOM Bretagne/Info/HPCAS E E S. E VEN, S. G UELTON & R. K ERYELL 56 / 361

Un ordinateur ? Mais quest-ce ?

Un ordinateur ? Mais quest-ce ?

Les bases de la numrologie

Le plan
1

Le plan
Modle mmoire & allocation Entres-sorties GNOME diteur exemple dEmacs Tuning de son clavier Compilation Modularisation Mise au point Dvermineur (debugger) Analyse mmoire Extensions Du C pour le graphisme C++ Dlires Le btisier Concours de programmes incomprhensibles Conclusion Index Table des matires
1

2 3

Introduction Bibliographie Petite histoire Langage Gnralits Un ordinateur ? Mais quest-ce ? Les bases de la numrologie Calcul binaire Dclarations Gnralits Types des objets Porte Expressions Smantique oprateurs Coercition de type Instructions Prprocesseur Bibliothques

9 10 11 12

2 3

13

14

Introduction Bibliographie Petite histoire Langage Gnralits Un ordinateur ? Mais quest-ce ? Les bases de la numrologie Calcul binaire Dclarations Gnralits Types des objets Porte Expressions Smantique oprateurs Coercition de type Instructions Prprocesseur Bibliothques

9 10 11 12

13

14

6 7 8

15 16 17

6 7 8

15 16 17

Modle mmoire & allocation Entres-sorties GNOME diteur exemple dEmacs Tuning de son clavier Compilation Modularisation Mise au point Dvermineur (debugger) Analyse mmoire Extensions Du C pour le graphisme C++ Dlires Le btisier Concours de programmes incomprhensibles Conclusion Index Table des matires

C avant C UV2 INF 446 TLCOM Bretagne/Info/HPCAS E E S. E VEN, S. G UELTON & R. K ERYELL 57 / 361

C avant C UV2 INF 446 TLCOM Bretagne/Info/HPCAS E E S. E VEN, S. G UELTON & R. K ERYELL 58 / 361

Un ordinateur ? Mais quest-ce ?

Les bases de la numrologie

Un ordinateur ? Mais quest-ce ?

Les bases de la numrologie

Un peu de numrologie

(I)

Reprsentation des entiers


Reprsentation canonique de a en base b :

(I)

Langage C proche du matriel indispensable de comprendre comment sont reprsents les nombres 1612 : John N APIER, premire trace des dcimaux (nombres ottants...), logarithmes et mthodes de multiplication 1703 : Gottfried L EIBNIZ Au lieu de la progression de dix en dix, jai employ depuis plusieurs annes la progression la plus simple de toutes, qui va de deux en deux : binaire. Simple car 2 chiffres (bit) ou 2 tats. 810 = 10002

a = (xn xn1 x2 x1 x0 )b avec xi /b et a=


i=0 n

xi b i

Choix de base adapt au contexte


Humains europens standard avec 10 doigts : choix de la base 10 Babylonniens : mlange de base 6 et 10 Certaines communauts africaines comptent en base 12 Boulier chinois : base 10 et 5 Diffrentes bases pour le temps
Secondes et minutes : base 60 (combien a dur la minute de 23h59 le 31/12/2005 ?) Heures : 12 ou 24

C avant C UV2 INF 446 TLCOM Bretagne/Info/HPCAS E E S. E VEN, S. G UELTON & R. K ERYELL 59 / 361

C avant C UV2 INF 446 TLCOM Bretagne/Info/HPCAS E E S. E VEN, S. G UELTON & R. K ERYELL 60 / 361

Un ordinateur ? Mais quest-ce ?

Les bases de la numrologie

Un ordinateur ? Mais quest-ce ?

Les bases de la numrologie

Reprsentation des entiers

(II)

Numrotation binaire
Anciens ordinateurs analogiques : manipulation directe de grandeurs physiques (tension, pression, force, champ magntique) ou temporelles (oprateurs statistiques) lies aux donnes

(I)

Jours : 7 dans la semaine 2831 dans le mois Mois : 12

des historiens des nombres !

Ordinateurs modernes utilisent composants tat binaire plus simples et plus robuste au monde extrieur Numrotation binaire (base 2) choisie en interne
Liaison avec lalgbre de George B OOLE (19me sicle) Chiffre binaire : bit (BInary digiT) ou b Dclin pour dbits dinformation : b/s

Nanmoins autres codages utiliss dans contextes particuliers


Symboles en communications : dbit de symbole : baud Codages redondants ou mous (aussi pour largent liquide !) pour aller vite : voir cours IAHP de master recherche informatique

C avant C UV2 INF 446 TLCOM Bretagne/Info/HPCAS E E S. E VEN, S. G UELTON & R. K ERYELL 61 / 361

C avant C UV2 INF 446 TLCOM Bretagne/Info/HPCAS E E S. E VEN, S. G UELTON & R. K ERYELL 62 / 361

Un ordinateur ? Mais quest-ce ?

Les bases de la numrologie

Un ordinateur ? Mais quest-ce ?

Les bases de la numrologie

Units binaires

(I)

Units binaires

(II)

Dispositifs de stockage binaires souvent adresss en binaire des capacits en puissance de 2 Bonjour Madame, je voudrais un ordinateur portable de 4 294 967 296 bits de mmoire : peu pratique... Constat que 210 = 1024 103 = 1000 Constat aussi que ( 3 )12 27 = 128 base de la musique 2 moderne europenne 12 quintes 7 octaves, dcoupage de la gamme en 12 demi-tons ... Dveloppement dans les uSI dun pendant binaire
http://physics.nist.gov/cuu/Units/binary.html http://fr.wikipedia.org/wiki/Pr%C3%A9fixe_binaire

Dcimal Facteur Prxe 10 106 109 1012 1015 1018


3

Binaire Facteur 2 220 230 240 250 260


10

Prxe Ki (kibi) Mi (mbi/mibi) Gi (gbi/gibi) Ti (tbi/tibi) Pi (pbi/pibi) Ei (exbi)

Dtail 1 024 1 048 576 1 073 741 824 1 099 511 627 776 1 125 899 906 842 624 1 152 921 504 606 846 976

k M G T P E

Mmoires dordinateurs mesures en units binaires : 512 Mio Mmoires magntiques et dbits rseaux en uSI classiques Grosses confusions en vue...

C avant C UV2 INF 446 TLCOM Bretagne/Info/HPCAS E E S. E VEN, S. G UELTON & R. K ERYELL 63 / 361

C avant C UV2 INF 446 TLCOM Bretagne/Info/HPCAS E E S. E VEN, S. G UELTON & R. K ERYELL 64 / 361

Un ordinateur ? Mais quest-ce ?

Les bases de la numrologie

Un ordinateur ? Mais quest-ce ?

Les bases de la numrologie

Autres bases drives du binaire

(I)

Base 8 (octal)
Base 8 = 23 Plus compact que le binaire Exprimable avec des chiffres normaux

(I)

Compter en binaire sur de grosses valeurs : lourd ! Souvent donnes binaires codes sur nombre entier de bits
Entiers Cls, signatures ...

Pratique pour reprsenter des choses sur 3 bits Droit sur chiers cods dans un nombre entier : drapeaux binaires -rwxr-xr-x 1 keryell keryell 6918 2005-10-12 22:03 hello_world Pour chaque ugo (user/group/other) et autre ACL (Access Control List)
r = 22 w = 21 x = 20

Utiliser une base regroupant plusieurs bits par chiffre

chiffre octal pour chaque ugo : 7558 umask


C avant C UV2 INF 446 TLCOM Bretagne/Info/HPCAS E E S. E VEN, S. G UELTON & R. K ERYELL 65 / 361 C avant C UV2 INF 446 TLCOM Bretagne/Info/HPCAS E E S. E VEN, S. G UELTON & R. K ERYELL 66 / 361

Un ordinateur ? Mais quest-ce ?

Les bases de la numrologie

Un ordinateur ? Mais quest-ce ?

Les bases de la numrologie

Base 8 (octal)

(II)

Base 16 (hexadcimal)

(I)

Binaire par tranche de 4 bits 10 chiffres + 6 lettres a (10) f (15)


Suppression de droits par dfaut lors de cration de chier et directement cod en octal 00268 supprime droit dcriture pour membres groupe et droit lecture+criture pour autres

Faisable avec afcheur 7 segments Trs utilis en informatique et lectronique numrique Cas particulier BCD (binaire cod dcimal), hexadcimal o on nutilise que chiffres 0 9
Calculs plus compliqus Conversions en dcimal humain plus simple (lectronique) En voie de disparition http://en.wikipedia.org/wiki/Binary-coded_decimal

Reprsentation des caractres (comportement par dfaut de od)

C avant C UV2 INF 446 TLCOM Bretagne/Info/HPCAS E E S. E VEN, S. G UELTON & R. K ERYELL 67 / 361

C avant C UV2 INF 446 TLCOM Bretagne/Info/HPCAS E E S. E VEN, S. G UELTON & R. K ERYELL 68 / 361

Un ordinateur ? Mais quest-ce ?

Les bases de la numrologie

Un ordinateur ? Mais quest-ce ?

Les bases de la numrologie

Base 256

(I)

Authentication avec mot de passe jetable S/Key (I)

Utilis pour reprsenter addresses IPv4 numriquement (193.50.97.146)256 = = ((25610 19310 + 5010 ) 25610 + 9710 ) 25610 + 14610 = 324130446610 Plus simple pour manipuler des prxes de classe A(/8), B(/16) ou C(/24) Caractres afchables cods souvent par valeur 8 bits
Chaque caractre peut tre vu comme chiffre en base 256 Dtaill plus tard dans le cours

Utilisation de challenge sur 64 bits que lutilisateur doit copier dans un dispositif dauthentication qui calculera le mot de passe utiliser Difcile de recopier rapidement et sans erreur E79F 3CA6 8C57 E381 par exemple Exemple ultime : utiliser des chiffres de 11 bits qui sont des mots cours choisis dans vocabulaire anglais
Plus long taper Mais moyen mnmotechnique et CRC (mot anglais)

TANK WELT MOT HAL FATE MUSH

C avant C UV2 INF 446 TLCOM Bretagne/Info/HPCAS E E S. E VEN, S. G UELTON & R. K ERYELL 69 / 361

C avant C UV2 INF 446 TLCOM Bretagne/Info/HPCAS E E S. E VEN, S. G UELTON & R. K ERYELL 70 / 361

Un ordinateur ? Mais quest-ce ?

Les bases de la numrologie

Un ordinateur ? Mais quest-ce ?

Calcul binaire

Base 65536

(I)

Le plan
1

Utile pour manipuler adresses ou grosses valeurs : 32, 64, 128... bits Regroupement de valeurs hexadcimales par paquet de 16 bits Adresses IPv6
128 bits : 2001:660:7302:e771:201:2ff:fefa:64ee Raccourci :: pour une suite de blocs de 16 bits 0 : 2001:7a8:b057::5

2 3

Codage de caractres sur 16 bits : UTF-16 ou 1 caractre 1 chiffre

Introduction Bibliographie Petite histoire Langage Gnralits Un ordinateur ? Mais quest-ce ? Les bases de la numrologie Calcul binaire Dclarations Gnralits Types des objets Porte Expressions Smantique oprateurs Coercition de type Instructions Prprocesseur Bibliothques

9 10 11 12

13

14

6 7 8
C avant C UV2 INF 446 TLCOM Bretagne/Info/HPCAS E E S. E VEN, S. G UELTON & R. K ERYELL 71 / 361

15 16 17

Modle mmoire & allocation Entres-sorties GNOME diteur exemple dEmacs Tuning de son clavier Compilation Modularisation Mise au point Dvermineur (debugger) Analyse mmoire Extensions Du C pour le graphisme C++ Dlires Le btisier Concours de programmes incomprhensibles Conclusion Index Table des matires

C avant C UV2 INF 446 TLCOM Bretagne/Info/HPCAS E E S. E VEN, S. G UELTON & R. K ERYELL 72 / 361

Un ordinateur ? Mais quest-ce ?

Calcul binaire

Un ordinateur ? Mais quest-ce ?

Calcul binaire

Reprsenter des nombres ngatifs

(I)

Reprsenter des nombres ngatifs


a + a 1[bn ] et donc

(II)

Pas que des entiers naturels... Rajouter bit de signe ? Ou utiliser astuce arithmtique modulo bn pour des nombres de n chiffres en base b... Remarquer que a + ((b 1) a) = b 1 Permet de dnir nombres quasi-opposs. Exemple en base 10 dun complment 9 : 1 + 8 9 2 3 7 6 9 9

a + (a + 1) 0[bn ]

Complment vrai ( b) a a + 1[bn ] 4 5 1 2 3 2 Pratique


Simple calculer Pas besoin de rajouter oprateur de soustraction Le +1 fait en utilisant entre retenue additionneur : gratis

2 3 9

+ 1

4 8 3

5 2 7 7 2 9

Complment restreint 12310 = 87610 dans /bn

C avant C UV2 INF 446 TLCOM Bretagne/Info/HPCAS E E S. E VEN, S. G UELTON & R. K ERYELL 73 / 361

C avant C UV2 INF 446 TLCOM Bretagne/Info/HPCAS E E S. E VEN, S. G UELTON & R. K ERYELL 74 / 361

Un ordinateur ? Mais quest-ce ?

Calcul binaire

Un ordinateur ? Mais quest-ce ?

Calcul binaire

Nombres binaires en complment 2


Cas particulier lectronique : 2 tats Nombres naturels sur n bits : [0, + 2n 1] Complment restreint 1 : simple inversion bit bit (oprateur ~ en C) Complment vrai 2 : (oprateur - en C) Convention : utilisation nombres signs en complment 2 sur n bits [2n1 , + 2n1 1]
2n1 (1000 00)[2n ] 1 (1111 11)[2n ] 0 (0000 00)[2n ] +1 (0000 01)[2n ] +2n1 1 (0111 11)[2n ]

(I)

Nombres binaires en complment 2


310 , 1 1012 11111 101 Bit de signe utilis pour complter bits manquants Utile aussi dans dcalages droite ( troncature sur nombre plus grand)

(II)

Attention aux comportements qui peuvent tre troublants (mais pratiques si on matrise...) http://xkcd.com/571

Bit de poids fort donne le signe Extension de prcision de n m bits, m > n


+310 , 0 0112
C avant C UV2 INF 446 TLCOM Bretagne/Info/HPCAS E E S. E VEN, S. G UELTON & R. K ERYELL 75 / 361

00000 011
C avant C UV2 INF 446 TLCOM Bretagne/Info/HPCAS E E S. E VEN, S. G UELTON & R. K ERYELL 76 / 361

Dclarations

Dclarations

Gnralits

Le plan
1

Le plan
Modle mmoire & allocation Entres-sorties GNOME diteur exemple dEmacs Tuning de son clavier Compilation Modularisation Mise au point Dvermineur (debugger) Analyse mmoire Extensions Du C pour le graphisme C++ Dlires Le btisier Concours de programmes incomprhensibles Conclusion Index Table des matires
1

2 3

Introduction Bibliographie Petite histoire Langage Gnralits Un ordinateur ? Mais quest-ce ? Les bases de la numrologie Calcul binaire Dclarations Gnralits Types des objets Porte Expressions Smantique oprateurs Coercition de type Instructions Prprocesseur Bibliothques

9 10 11 12

2 3

13

14

Introduction Bibliographie Petite histoire Langage Gnralits Un ordinateur ? Mais quest-ce ? Les bases de la numrologie Calcul binaire Dclarations Gnralits Types des objets Porte Expressions Smantique oprateurs Coercition de type Instructions Prprocesseur Bibliothques

9 10 11 12

13

14

6 7 8

15 16 17

6 7 8

15 16 17

Modle mmoire & allocation Entres-sorties GNOME diteur exemple dEmacs Tuning de son clavier Compilation Modularisation Mise au point Dvermineur (debugger) Analyse mmoire Extensions Du C pour le graphisme C++ Dlires Le btisier Concours de programmes incomprhensibles Conclusion Index Table des matires

C avant C UV2 INF 446 TLCOM Bretagne/Info/HPCAS E E S. E VEN, S. G UELTON & R. K ERYELL 77 / 361

C avant C UV2 INF 446 TLCOM Bretagne/Info/HPCAS E E S. E VEN, S. G UELTON & R. K ERYELL 78 / 361

Dclarations

Gnralits

Dclarations

Gnralits

Objets en C

(I)

Types en C
Types dobjet
Types scalaires : objets lmentaires proches du matriel

(I)

Zone de stockage dinformation (mmoire, registre) Type prcisant comportement en mmoire, valeurs possibles Mmoire : espace de stockage unique orient octet (caractres de base), dcomposable en bits Dclaration : dnit statiquement type de variable, argument ou valeur de retour de fonction (type de fonction)

Types arithmtiques : pour faire des calculs au sens classique Pointeurs : rfrence dautres objets ou fonctions

Types agrgs
Vecteurs : rptition ordonne dun mme type Structures : rassemble lments htrognes Union : fait coexister plusieurs types au mme endroit mmoire

Types de fonction : prcise la fois type valeur de retour et type arguments Types incomplets
Incompltude totale void Vecteur de taille non prcise Structure non prcise

C avant C UV2 INF 446 TLCOM Bretagne/Info/HPCAS E E S. E VEN, S. G UELTON & R. K ERYELL 79 / 361

C avant C UV2 INF 446 TLCOM Bretagne/Info/HPCAS E E S. E VEN, S. G UELTON & R. K ERYELL 80 / 361

Dclarations

Gnralits

Dclarations

Gnralits

Types arithmtiques en C

(I)

Dclaration de variable

(I)

attributs-type type identificateur [,identificateur]*; Intgraux (comportement de type entier naturel ou relatif)
Boolens (C99) : bool Caractres : [signed|unsigned]char Entiers : [unsigned][short|long|longlong]int numration : entiers nomms

Attribut de type
Spcications de rangement
auto : dans la pile extern : dnie ailleurs register : essaye de garder en registre (trs rapide mais rare, donc chre...) Moins ncessaire avec bons compilateurs static : local au chier ou garde une vie aprs la mort

Nombres ottants : approximation de la continuit

Flottants rels : approximation de oat |[long]double Flottants complexes (C99) : approximation de


( oat|[long]double)complex

Qualicatifs daide au compilateur


const : garantie sur lhonneur valeur constante. Plus propre que dutiliser prprocesseur restrict : garantie sur lhonneur alias de pointeurs (C99) volatile : monde en dehors du programme

Identicateur : nom de lobjet

C avant C UV2 INF 446 TLCOM Bretagne/Info/HPCAS E E S. E VEN, S. G UELTON & R. K ERYELL 81 / 361

C avant C UV2 INF 446 TLCOM Bretagne/Info/HPCAS E E S. E VEN, S. G UELTON & R. K ERYELL 82 / 361

Dclarations

Gnralits

Dclarations

Gnralits

Identicateurs
Suite de caractres alphanumriques En C99 utilisation possible de caractres tendus (UTF-8...) si travail collaboratif, rachat dentreprise mondialis... mais programmes sources en anglais/amricain. Mais des mots trangers en amricain Premier caractre alphabtique ou _ Sensible la casse des lettres contrairement Fortran Utilisation possible de la casse pour exprimer une smantique
Variables en minuscule i
Utilisation du _ pour sparer des mots search_generic_record Utilisation de capitales sparer des mots searchGenericRecord

(I)

Identicateurs

(II)

Prfrer variables longues et claires plutt que courtes et obscures


Utiliser IDE (Eclipse...) ou diteur (Emacs ! automatique, menus... ...) avec compltion

Constantes du prprocesseur en majuscule N_ITER

Choix faire dans projet, entreprise,...


C avant C UV2 INF 446 TLCOM Bretagne/Info/HPCAS E E S. E VEN, S. G UELTON & R. K ERYELL 83 / 361 C avant C UV2 INF 446 TLCOM Bretagne/Info/HPCAS E E S. E VEN, S. G UELTON & R. K ERYELL 84 / 361

Dclarations

Gnralits

Dclarations

Gnralits

Mots-cls rservs en C
Ne pas utiliser du langage C comme identiant ! _Bool, _Complex, _Imaginary, auto, break, case, char, const, continue, default, do, double, else, enum, extern, float, for, goto, if, inline, int, long, register, restrict, return, short, signed, sizeof, static, struct, switch, typedef, union, unsigned, void, volatile, while En gras : nouveauts dans C99 par rapport C89

(I)

Mots-cls rservs en C

(II)

Identiant commenant par SIG suivi par _ ou majuscule Comparaison avec diffrents dialectes du C :
http://www.georgehernandez.com/xComputers/Cs/Keywords.htm

viter aussi utilisation didentiants de bibliothques standards sauf hack ou programmation systme hard core Extensions possibles dj prvues dans le langage C99 et POSIX.1 : viter E suivie dun chifre ou majuscule, identiant commenant par is, to, LC_, str, mem, wcs Ne pas dnir identiant commenant par _ et suivi par une majuscule ou _
C avant C UV2 INF 446 TLCOM Bretagne/Info/HPCAS E E S. E VEN, S. G UELTON & R. K ERYELL 85 / 361 C avant C UV2 INF 446 TLCOM Bretagne/Info/HPCAS E E S. E VEN, S. G UELTON & R. K ERYELL 86 / 361

Dclarations

Types des objets

Dclarations

Types des objets

Le plan
1

Caractres
Modle mmoire & allocation Entres-sorties GNOME diteur exemple dEmacs Tuning de son clavier Compilation Modularisation Mise au point Dvermineur (debugger) Analyse mmoire Extensions Du C pour le graphisme C++ Dlires Le btisier Concours de programmes incomprhensibles Conclusion Index Table des matires

(I)

2 3

Introduction Bibliographie Petite histoire Langage Gnralits Un ordinateur ? Mais quest-ce ? Les bases de la numrologie Calcul binaire Dclarations Gnralits Types des objets Porte Expressions Smantique oprateurs Coercition de type Instructions Prprocesseur Bibliothques

9 10 11 12

Utiliss pour saisir programmes avec diteur et compiler Utiliss dans donnes manipules par programmes Pas forcment les mme encodages... Programme anglais ASCII peut manipuler des donnes crites en corens UTF-8... Bien comprendre la notion de caractres ! Nombres utiliss pour reprsenter choses afchables

13

14

6 7 8

15 16 17

C avant C UV2 INF 446 TLCOM Bretagne/Info/HPCAS E E S. E VEN, S. G UELTON & R. K ERYELL 87 / 361

C avant C UV2 INF 446 TLCOM Bretagne/Info/HPCAS E E S. E VEN, S. G UELTON & R. K ERYELL 88 / 361

Dclarations

Types des objets

Dclarations

Types des objets

Table des caractres ASCII


Codage de caractre trs utilis (ISO-646) Base de nombreux autres encodages (UNICODE = ISO-10646) Inconscient collectif trs important
http://www.georgehernandez.com/xComputers/CharacterSets/ASCII.htm

(I)

Table des caractres ASCII


014 015 016 017 018 019 020 021 022 023 024 025 026 027 028 029 030 031 032 033 034 035 036 037 0001110 0001111 0010000 0010001 0010010 0010011 0010100 0010101 0010110 0010111 0011000 0011001 0011010 0011011 0011100 0011101 0011110 0011111 0100000 0100001 0100010 0100011 0100100 0100101 016 017 020 021 022 023 024 025 026 027 030 031 032 033 034 035 036 037 040 041 042 043 044 045 0E 0F 10 11 12 13 14 15 16 17 18 19 1A 1B 1C 1D 1E 1F 20 21 22 23 24 25 CTRL-N CTRL-O CTRL-P CTRL-Q CTRL-R CTRL-S CTRL-T CTRL-U CTRL-V CTRL-W CTRL-X CTRL-Y CTRL-Z CTRL-[ CTRL-\ CTRL-] CTRL-^ CTRL-_ ! " # $ %

(II)

Dec Binary Oct Hex Char Remark ===================================== 000 0000000 000 00 CTRL-@ \0 NUL (Null prompt) 001 0000001 001 01 CTRL-A SOH (Start Of Heading, console interrupt) 002 0000010 002 02 CTRL-B STX (Start of TeXt, maintenance mode on HP) 003 0000011 003 03 CTRL-C ETX (End of TeXt) 004 0000100 004 04 CTRL-D EOT (End Of Transmission, not same as ETB) 005 0000101 005 05 CTRL-E ENQ (ENQuiry, goes with ACK; old HP flow control) 006 0000110 006 06 CTRL-F ACK (ACKnowledge, clears ENQ logon hand) 007 0000111 007 07 CTRL-G \a BEL (BELl) 008 0001000 010 08 CTRL-H \b BS (BackSpace, works on HP) 009 0001001 011 09 CTRL-I \t HT (Horizontal Tab) 010 0001010 012 0A CTRL-J \n LF (Line Feed) or NL (New Line) or EOL (End Of Line). Unix EOL. 011 0001011 013 0B CTRL-K \v VT (Vertical Tab) 012 0001100 014 0C CTRL-L \f NP (New Page, page eject) or FF (Form Feed) 013 0001101 015 0D CTRL-M \r CR (Carriage Return). Mac EOL (Win EOL is \r\n).
C avant C UV2 INF 446 TLCOM Bretagne/Info/HPCAS E E S. E VEN, S. G UELTON & R. K ERYELL 89 / 361

SO (Shift Out, alternate character set) SI (Shift In, resume default character set) DLE (Data Link Escape) DC1 (X-ON, with XOFF to pause listings; ":okay to send") DC2 (Device Control 2, block-mode flow control) DC3 (X-OFF, with XON is TERM=18 flow control) DC4 (Device Control 4) NAK (Negative AcKnowlede) SYN (SYNchronous idle) ETB (End Transmission Block, not same as EOT) CAN (CANcel, MPE echoes) EM (End of Medium, Control-Y interrupt) SUB (Substitute) \e ESC (ESCape, next character not echoed) FS (File Separator) or IS4 (Info Separator 4) GS (Group Separator) or IS3 RS (Record Separator, block-mode terminator) or IS2 US (Unit Separator) or IS1 space. %20(+ in URLs) exclamation point, factorial, bang double quote. &quot;(XML too). \" sharpsign, cross hatch, number sign. %23(bookmark in URLs) dollar sign percent sign. %25(escape in URLs)

C avant C UV2 INF 446 TLCOM Bretagne/Info/HPCAS E E S. E VEN, S. G UELTON & R. K ERYELL 90 / 361

Dclarations

Types des objets

Dclarations

Types des objets

Table des caractres ASCII


038 039 040 041 042 043 044 045 046 047 048 049 050 051 052 053 054 055 056 057 058 059 060 061 0100110 0100111 0101000 0101001 0101010 0101011 0101100 0101101 0101110 0101111 0110000 0110001 0110010 0110011 0110100 0110101 0110110 0110111 0111000 0111001 0111010 0111011 0111100 0111101 046 047 050 051 052 053 054 055 056 057 060 061 062 063 064 065 066 067 070 071 072 073 074 075 26 27 28 29 2A 2B 2C 2D 2E 2F 30 31 32 33 34 35 36 37 38 39 3A 3B 3C 3D & ( ) * + , . / 0 1 2 3 4 5 6 7 8 9 : ; < =

(III)

Table des caractres ASCII


062 063 064 065 066 ... 090 091 092 093 094 095 096 097 098 ... 122 123 124 125 126 127 0111110 0111111 1000000 1000001 1000010 1011010 1011011 1011100 1011101 1011110 1011111 1100000 1100001 1100010 1111010 1111011 1111100 1111101 1111110 1111111 076 077 100 101 102 132 133 134 135 136 137 140 141 142 172 173 174 175 176 177 3E 3F 40 41 42 5A 5B 5C 5D 5E 5F 60 61 62 7A 7B 7C 7D 7E 7F > ? @ A B Z [ \ ] ^ _ a b z { | } ~ right angle bracket, greater than. &gt;(XML too) question mark. %3F(begin query string in URLs) "at" sign 32 difference between UPPER and lower case.

(IV)

ampersand. &amp;(XML too). %26(parameter delimiter in URLs) single quote, acute accent. &apos;(XML too) \ left parenthesis right parenthesis asterisk, star, multiply plus sign. comma hyphen, minus period, full stop slash, virgule, slant, forward slash, divide. %2F

left square bracket backslash, reverse slant, reverse solidus right square bracket caret, circumflex. subs: &#x02C6; &#710; &circ; underscores grave accent. Not in C.

colon semicolon left angle bracket, less than. &lt;(XML too) equals sign

left curly brace vertical bar right curly brace tilde DEL (DELete or rubout), cross-hatch box

C avant C UV2 INF 446 TLCOM Bretagne/Info/HPCAS E E S. E VEN, S. G UELTON & R. K ERYELL 91 / 361

C avant C UV2 INF 446 TLCOM Bretagne/Info/HPCAS E E S. E VEN, S. G UELTON & R. K ERYELL 92 / 361

Dclarations

Types des objets

Dclarations

Types des objets

Table des caractres ASCII


Proprits intressantes
Codable sur 7 bits Il ny a pas que des glyphes afchables ! Caractres protocolaires Les chiffres se suivent : conversion caractre valeur facile (mme proprit en EBCDIC) Les lettres aussi... tri facile Diffrence minuscules/majuscule = 32 DEL et les cartes perfores...

(V)

Table des caractres ASCII

(VI)

crire portable, utiliser logiciels de conversion ou encodages Emacs (sufxes -dos, -mac, -unix...) Utilis comme base de majorit encodages Mais dautres encodages
Telex : 5 bits EBCDIC (IBM) Ordinateurs Bull

Protocoles complexes construits autour ASCII : terminaux ANSI, Minitel...


Changements de couleurs, fontes, clignotement, inversion vido Mouvement de curseurs Extensions graphiques

aux ns de ligne des chiers textes ...


Unix : LF MacOS : CR Windows : CR + LF

C avant C UV2 INF 446 TLCOM Bretagne/Info/HPCAS E E S. E VEN, S. G UELTON & R. K ERYELL 93 / 361

C avant C UV2 INF 446 TLCOM Bretagne/Info/HPCAS E E S. E VEN, S. G UELTON & R. K ERYELL 94 / 361

Dclarations

Types des objets

Dclarations

Types des objets

Codage ISO-8859

(I)

Codage UNICODE

(I)

Projet ambitieux pour englober toutes langues terrestres (et autres : Seigneur des Anneaux, Klingon...) Extension 8 bits de lASCII pour alphabets europens ISO-8859-1 (latin-1) pour le franais... ou presque les , ... ( au cur de lH A- LES -R OSES ) Tout loge dans un entier de 8 bits : manque Radical codage en 32 bits (UTF-32) Srialisation en codes plus petits avec optimisation caractres de base (guerres de religion...) + caractres chappement
UTF-16 : codage en 16 bits UTF-8 : codage en 8 bits (de 1 caractre 8 bits 4) UTF-7 : codage en 7 bits

... corrig en ISO-8859-15 (latin-9) qui inclut au passage l

+ Variantes petit/grand-boutien... Surensemble dASCII ( pas dISO-8859) Rajout de caractres larges dans C99

C avant C UV2 INF 446 TLCOM Bretagne/Info/HPCAS E E S. E VEN, S. G UELTON & R. K ERYELL 95 / 361

C avant C UV2 INF 446 TLCOM Bretagne/Info/HPCAS E E S. E VEN, S. G UELTON & R. K ERYELL 96 / 361

Dclarations

Types des objets

Dclarations

Types des objets

Caractres de base
char : entier dau moins 8 bits Reprsente en gnral case mmoire la plus petite adressable directement par la machine Taille concrte en bit : CHAR_BIT Non spci si sign ou pas explicitement en version signe (signedchar) ou pas (unsignedchar)

(I)

Caractres de base

(II)

1 2

10

Caractre utilis comme unit de mesure de stockage via oprateur sizeof() donc par dnition sizeof(char) vaut 1 (gdb) print sizeof(long long int) $1 = 8 CHAR_BIT pour taille en bittaille Limites relles dnie pour lenvironnement dans <limits.h>
C avant C UV2 INF 446 TLCOM Bretagne/Info/HPCAS E E S. E VEN, S. G UELTON & R. K ERYELL 97 / 361

12

14

/Number of b i t s in a char . / # define CHAR_BIT 8 /Minimumandmaximum v al u e s a s i g n e dchar can hold . / # define SCHAR_MIN ( 128) # define SCHAR_MAX 127 /Maximum v al u e an unsigned char can hold . (Minimum i s 0 . ) / # define UCHAR_MAX 255 /Minimumandmaximum v al u e s a char can hold . / # i f d e f __CHAR_UNSIGNED__ # define CHAR_MIN 0 # define CHAR_MAX UCHAR_MAX # else define CHAR_MIN SCHAR_MIN # # define CHAR_MAX SCHAR_MAX # e n d if

C avant C UV2 INF 446 TLCOM Bretagne/Info/HPCAS E E S. E VEN, S. G UELTON & R. K ERYELL 98 / 361

Dclarations

Types des objets

Dclarations

Types des objets

Nombres entiers

(I)

Nombres entiers
1 2

(II)

4 tailles dentiers signs (par dfaut)



shortint ou short (pour les mards) int longint ou long (pour les mards) longlongint ou longlong (pour les mards) en C99

10

(gnralisation machines 64 bits)

On peut rajouter signed pour claircir 4 types non signs : rajouter unsigned au 4 prcdents Relation directe entre dynamique et taille

12

14

16

18

20

/Minimumandmaximum v al u e s a s i g n e d s hor t i n t can hold . / # define SHRT_MIN 32768) ( # define SHRT_MAX 32767 /Maximum v al u e an unsigned s hor t i n t can hold . (Minimum i s 0 . ) / # define USHRT_MAX 65535 /Minimumandmaximum v al u e s a s i g n e d i n t can hold . / # define INT_MIN (INT_MAX 1 ) # define INT_MAX 2147483647 /Maximum v al u e an unsigned i n t can hold . (Minimum i s 0 . ) / # define UINT_MAX 4294967295U /Minimumandmaximum v al u e s a s i g n e d long i n t can hold . / # i f __WORDSIZE == 64 # define LONG_MAX 9223372036854775807L # else # define LONG_MAX 2147483647L # e n d if (LONG_MAX 1L ) # define LONG_MIN /Maximum v al u e an unsigned long i n t can hold . (Minimum i s 0 . ) / # i f __WORDSIZE == 64 # define ULONG_MAX 18446744073709551615UL

C avant C UV2 INF 446 TLCOM Bretagne/Info/HPCAS E E S. E VEN, S. G UELTON & R. K ERYELL 99 / 361

C avant C UV2 INF 446 TLCOM Bretagne/Info/HPCAS E E S. E VEN, S. G UELTON & R. K ERYELL 100 / 361

Dclarations

Types des objets

Dclarations

Types des objets

Nombres entiers

(III)

Nombres entiers

(IV)

22

24

26

28

30

# else # define ULONG_MAX 4294967295UL # e n d if # i f d e f __USE_ISOC99 /Minimumandmaximum v al u e s a s i g n e d long long i n t can hold . / # define LLONG_MAX 9223372036854775807LL # define LLONG_MIN (LLONG_MAX 1LL ) /Maximum v al u e an unsigned long long i n t can hold . (Minimum i s 0 . ) / # define ULLONG_MAX18446744073709551615ULL # e n d if /ISOC99/

Si grosse taille : calculs ventuellement plus long, stockage plus gros, temps de transfert processeur-disque/mmoire/rseau plus long... Choisir toujours au moins une taille sufsante pour stocker information (analyse de dynamique) Nombre de bit utiliss pour coder v : nv = log2 v + 1 ventuellement compacter par changement de repre dans donnes algorithme

Dbordements lors de calculs... Pas de contrle lors de lexcutions. Sens de lconomie du C : excution rapide

Mais peut aussi tre subtilement utilis (arithmtique modulo 2n , signe ou pas...) Sens de lconomie du C : laisse programmeur libre
C avant C UV2 INF 446 TLCOM Bretagne/Info/HPCAS E E S. E VEN, S. G UELTON & R. K ERYELL 101 / 361

C avant C UV2 INF 446 TLCOM Bretagne/Info/HPCAS E E S. E VEN, S. G UELTON & R. K ERYELL 102 / 361

Dclarations

Types des objets

Dclarations

Types des objets

Types entiers tendus de taille connue


Taille des entiers prcdents dpendent machine & environnement cible Si besoin contrle n taille des donnes (viter dbordements, contrleurs de priphrique, microcontrleur) ? Rajouts de types taille xe dnis dans <stdint.h>
int8_t, int16_t, int32_t, int64_t : type signs avec exactement nombre de bits uint8_t, uint16_t, uint32_t, uint64_t : idem non sign

(I)

Types entiers tendus de taille connue

(II)

1 2

/ Minimum o f s i g n e d i n t e g r a l t y p e s h a v i n g aminimum s i z e . / # define INT_LEAST8_MIN ( -128) / Maximum o f s i g n e d i n t e g r a l t y p e s h a v i n g aminimum s i z e . / # define INT_LEAST8_MAX (127) / Maximum o f u n s i g n e d i n t e g r a l t y p e s h a v i n g aminimum s i z e . / # d e f i n e U I N T _ L E A S T 8 _ M A X (255)

Taille au moins avec n bits : int_least n_t et uint_least n_t Concept intressant : type le plus rapide et sufsamment gros (parfois, si plus gros, plus rapide) int_fast n_t et uint_fast n_t Pour tout les cas, limites disponibles TYPE_MIN, TYPE_MAX, UTYPE_MAX. Exemple :

C avant C UV2 INF 446 TLCOM Bretagne/Info/HPCAS E E S. E VEN, S. G UELTON & R. K ERYELL 103 / 361

C avant C UV2 INF 446 TLCOM Bretagne/Info/HPCAS E E S. E VEN, S. G UELTON & R. K ERYELL 104 / 361

Dclarations

Types des objets

Dclarations

Types des objets

Caractres larges

(I)

Boolens

(I)

Traditionnellement en C, lentier 0 valait faux et tout autre valeur signiait vrai Rajout type bool dans C99 pour expliciter Pour grer des caractres tendus (UNICODE...) char trop petit Dnition dans <wchar.h> de caractres tendus wchar_t Dnition dentiers de mme taille wint_t pour viter trop de conversions parfois nombreux programmes qui dnissaient dj leur propre conit ! style bool...

Pour viter conits probables, C99 introduit en fait type natif _Bool, moins probable Ensuite, dnitions dans <stdbool.h> des types programmeur . Exemple dans GCC :
1 2

# d e f i n e bool _Bool # d e f i n e true 1 # d e f i n e false 0

C avant C UV2 INF 446 TLCOM Bretagne/Info/HPCAS E E S. E VEN, S. G UELTON & R. K ERYELL 105 / 361

C avant C UV2 INF 446 TLCOM Bretagne/Info/HPCAS E E S. E VEN, S. G UELTON & R. K ERYELL 106 / 361

Dclarations

Types des objets

Dclarations

Types des objets

numrations
Dnition de constantes entires nommes
1

(I)

numrations

(II)

enum[type] { identifiant[= expression-const] [,...] [,] } ;

Par dfaut commence 0 Ensuite par dfaut, constante prcdente + 1 Exemples


1

Avantage par rapport une macro-constante du prprocesseur :


vite de savoir compter de un en un Connue du dbogueur : afchable, manipulable Typage vriable par le compilateur

11

enum e _ r e c o r d _ t y p e { CODER_RECORD , MATCHER_RECORD , COMPACT_RECORD }; enum d e a l _ w i t h _ b a s e _ p k _ f u n c t i o n { J O B _ A D D _ P K _ I N _ L I S T = 47 , J O B _ W R I T E _ A _ P R E R O T E D _ S E A R C H = 53 , JOB_WRITE_A_NEUTRAL_REF }; enum{ L O G 2 _ Y A X I S _ D E F = 8 }; //Typeanonyme

Astuce : transformation des #dene en enum :


sed s/#define[ \\t][\ \t]*\([^()\\t ][^()\\t ]*\)[ \\t][ \\t]*\(.*\)$/enum { \1 = \2 };/

C avant C UV2 INF 446 TLCOM Bretagne/Info/HPCAS E E S. E VEN, S. G UELTON & R. K ERYELL 107 / 361

C avant C UV2 INF 446 TLCOM Bretagne/Info/HPCAS E E S. E VEN, S. G UELTON & R. K ERYELL 108 / 361

Dclarations

Types des objets

Dclarations

Types des objets

Nombres ottants
Besoin de reprsenter des valeurs plus continues et plus de dynamique que types entiers Sous-ensemble de ( ) Reprsentation souvent au format IEEE 754-1985 f = (1)S M 2E

(I)

Nombres ottants
Codage en mmoire Format Simple Double tendu Totale 32 64 80 Taille en bit Signe Exposant 1 8 1 11 1 15 Mantisse 24 53 64

(II)

Plusieurs tailles de ottants

S : bit de signe M : mantisse (entier positif) E : exposant Simple prcision ( oat ) Double prcision (double) Prcision tendue (longdouble)

1 + 8 + 24 = 33 = 32 : voir plus tard... Exposant cod en biais : Erel = Estock Ebiais Tri lexicographique sur bits compatible avec tri ottant ! Mme si on ne gre pas le ottant on sait trier
Format Simple Double tendu Minimum en dnormalis 1,4 1045 4,9 10324 3,6 104951 Minimum en normalis 1,2 1038 2,2 10308 3,4 104932 Maximum ni 3,4 1038 1,8 10308 1,2 104932 2N (grain) 5,96 108 1,11 1016 5,42 1020 Chiffres signicatifs 69 1517 1821

Nombreux paramtres dnis dans <float.h>


C avant C UV2 INF 446

C avant C UV2 INF 446 TLCOM Bretagne/Info/HPCAS E E S. E VEN, S. G UELTON & R. K ERYELL 109 / 361

TLCOM Bretagne/Info/HPCAS E E

S. E VEN, S. G UELTON & R. K ERYELL

110 / 361

Dclarations

Types des objets

Dclarations

Types des objets

Nombres ottants
Possibilit de dclencher exceptions (division par 0, dbordement,...) (fonction excute sur vnement) Rajout de quantits symboliques (dclares dans <math.h>)
+0 et 0. Nanmoins +0 = 0 est vrai 1 1 + et (par exemple +0 et 0 ) (HUGE_VAL...) 0 NaN (Not a Number) pour 0 ou 1 Seul cas ou x = x lorsque x vaut NaN. Existe en sign et en version dclenchant exception (SNaN)

(III)

Conversion ottantsentiers larrache


En temps normal int i=(int)f doit faire le travail nombreuses fonctions de conversion et darrondi dans la bibliothque mathmatique (rint(), round()...) La bibliothque du C permet de le faire tout seul mais pas toujours disponible (cf. microcontrleur Coupe de Robotique 2008). Pour hackers :
1 2

(I)

Peuvent simplier programmation et calcul si bien gr (viter tests cas particuliers...) Nombreux choix darrondi (plus proche, +, -, vers 0,...) http://grouper.ieee.org/groups/754 En cours de rvision http://en.wikipedia.org/wiki/IEEE_754r si vous voulez participer Plein de subtilits
C avant C UV2 INF 446 TLCOM Bretagne/Info/HPCAS E E S. E VEN, S. G UELTON & R. K ERYELL 111 / 361

10

i n t ftoi ( f l o a t f ) { // Rcupre l e s b i t s du f l o t t a n t dans un e n t i e r : uint32_t dw = *(( uint32_t *) & f ); // La v a l e u r s p c i a l e o t o u s l e s b i t s s o n t 0 code 0 : i f ( dw == 0) r e t u r n 0; // Rcupre l e x p o s a n t cod s u r 8 b i t s e t compense l e b i a i s : char exp = ( dw >> 23) - 127; // Suppose un c har de 8 b i t s i f ( exp < 0 || exp > 23) / S i l e x p o s a n t e s t n g a t i f , de t o u t e manire , l e nombre v a u t

C avant C UV2 INF 446 TLCOM Bretagne/Info/HPCAS E E S. E VEN, S. G UELTON & R. K ERYELL 112 / 361

Dclarations

Types des objets

Dclarations

Types des objets

Conversion ottantsentiers larrache


12

(II)

Nombres ottants = rels !


What Every Computer Scientist Should Know About Floating-Point Arithmetic , David G OLDBERG, Computing Surveys, mars 1991, ACM Nombres ottants pale imitation de et mme de Nombreuses approximations associatif (1 1040 ) 1040 = 0 1 (1040 1040 ) = 1 Proprits algbriques de non vries : non

(I)

14

16

18

20

22

24

26

moins que 1 , donc a r r o n d i 0 . S i c e s t s u p r i e u r 23 , l e nombre e s t s u p r i e u r 2^{24} en on d c i d e de l e j e t e r e t de r pon dr e a r b i t r a i r e m e n t 0 . M m . . On p o u r r a i t g r e r j u s q u 2^{32} mais m m. f a u d r a i t c o r r i g e r l e code c i a p r s / r e t u r n 0; / C o n s t r u i t l e nombre av e c l e 1 de p o i d s f o r t q u i e s t conomis dans l a norme IEEE754, p u i s l e s 23 a u t r e s b i t s de l a m an t i s s e c a d r s en f o n c t i o n de l e x p o s a n t : / i n t val = (1 << exp ) + (( dw & 0 x7FFFFF ) >> (23 - exp )); // En f o n c t i o n du b i t de s i g n e , i n v e r s e l e r s u l t a t : i f ( dw & 0 x80000000 ) r e t u r n - val ; else r e t u r n val ; }

Bon, videmment, ceci ne gre pas toute la norme, le dnormalis, les innis, etc.

Changement des rsultats possibles selon optimisations... Notion dquivalence squentielle de programme entre diffrentes versions
C avant C UV2 INF 446 113 / 361 TLCOM Bretagne/Info/HPCAS E E S. E VEN, S. G UELTON & R. K ERYELL 114 / 361

C avant C UV2 INF 446 TLCOM Bretagne/Info/HPCAS E E S. E VEN, S. G UELTON & R. K ERYELL

Dclarations

Types des objets

Dclarations

Types des objets

Nombres ottants = rels !

(II)

Algorithme de sommation de ottants

(I)

Forte : le programme obtenu donne le mme rsultat Faible : le programme obtenu donne le mme rsultat modulo les problmes numriques prcdents

Solution triviale
1 2

Choisir programmation prenant en compte ces caractristiques


TEX crit en virgule xe 16+16 bits pour portabilit multi-plateforme Compromis entre performances & prcision

double x [ N ]; double s = 0; f o r ( i n t i = 0; i < N ; i ++) s += x [ i ];


N1

Compilateurs devraient en tenir compte (pas optimisations sauvages) Exemples


(x y )(x + y ) plus prcis (voire plus rapide) que x 2 y 2 Algorithme somme de ottants

s=
i=0

xi (1 + i )

avec |i | < (N i)

C avant C UV2 INF 446 TLCOM Bretagne/Info/HPCAS E E S. E VEN, S. G UELTON & R. K ERYELL 115 / 361

C avant C UV2 INF 446 TLCOM Bretagne/Info/HPCAS E E S. E VEN, S. G UELTON & R. K ERYELL 116 / 361

Dclarations

Types des objets

Dclarations

Types des objets

Algorithme de sommation de ottants


Version K AHAN
1 2

(II)

Vers des nombres ottants normaliss

(I)

double x [ N ]; double s = x [0]; double c = 0; // Erreur d a r r o n d i f o r ( i n t i = 1; i < N ; i ++) { double y = x [ i ] - c ; // Compense e r r e u r p r c d e n t e double t = s + y ; // N o u v e l l e somme c = (t - s) - y; // Estime l e r r e u r a r r o n d i s = t; }
N1 N1

Possible de reprsenter des nombres de plusieurs manires M = 2a M E = E + a Problme des codages redondants : comparaisons difciles Ide 1 : normaliser ! Exemple : choisir le M le plus grand pouvant loger dans les bits allous pour la mantisse Ide 2
M = 0 : commence toujours par 1 en binaire Ne pas stocker ce 1 vident...

s=
i=0

xi (1 + i ) + O(N2
i=0

|xi |)

avec |i | 2

Optimisations incontrles du programme fait des ravages ici... car revient algorithme trivial !

Flottant normalis : gagne 1 bit de prcision pour la mantisse !

C avant C UV2 INF 446 TLCOM Bretagne/Info/HPCAS E E S. E VEN, S. G UELTON & R. K ERYELL 117 / 361

C avant C UV2 INF 446 TLCOM Bretagne/Info/HPCAS E E S. E VEN, S. G UELTON & R. K ERYELL 118 / 361

Dclarations

Types des objets

Dclarations

Types des objets

Pourquoi des nombres ottants dnormaliss ?


Soustraction de 2 nombres normaliss, par exemple en simple prcision a = 2,05 1037 b = 2,03 1037 a b = 2 1039 ab =0 a=b Seule solution car M ne peut pas commencer par 1... Ide : rajouter mode dnormalis pour trs petits nombres o M peut ne pas commencer par un 1 Permet underow (dpassement de capacit par le bas) progressif
C avant C UV2 INF 446 TLCOM Bretagne/Info/HPCAS E E S. E VEN, S. G UELTON & R. K ERYELL

(I)

Pourquoi des nombres ottants dnormaliss ? (II)

Si ottant dnormalis non gr directement en matriel : gnre exception et calculs termins par... systme dexploitation performances Parfois autorisation exception = suppression pipeline (DEC Alpha)

C avant C UV2 INF 446 119 / 361 TLCOM Bretagne/Info/HPCAS E E S. E VEN, S. G UELTON & R. K ERYELL 120 / 361

Dclarations

Types des objets

Dclarations

Types des objets

Dnormalisation ottante
Parfois exception IEEE-754 gnre lors de la dnormalisation Typiquement un programme de diffrences nie avec un domaine avec de petites valeur entour de 0 :
n xi,j = v v v v xi1,j + xi+1,j + xi,j1 + xi,j+1

(I)

Dnormalisation ottante

(II)

pleurer sur machine parallle si ordonnancement statique : tous les processeurs attendent le plus lent ! Rajout dun biais pour ne plus tre au voisinage de 0. Mais perte de dynamique... Compromis
n yi,j

4 = =
n xi,j + b v yi1,j

Propagation dondes de dnormalisation


0 0 0 0 0 0 0 0
C avant C UV2 INF 446 TLCOM Bretagne/Info/HPCAS E E S. E VEN, S. G UELTON & R. K ERYELL 121 / 361

(1)
v yi+1,j

0 0 0 0 0 0 0 0

0 0 0 0

0 0 0 0

0 0 0 0

0 0 0 0 0 0 0 0

0 0 0 0 0 0 0 0

0 0 0 0 0 0 0 0

0 0 d d d d 0 0

0 d d d d d d 0

0 d d d d 0

0 d d d d d d 0

0 0 d d d d 0 0

0 0 0 0 0 0 0 0

0 0 d d d d 0 0

0 d d d d d d 0

d d d d d d d d

d d d d d d d d

d d d d d d d d

0 d d d d d d 0

0 0 d d d d 0 0

n yi,j

+ 4

v yi,j1

v yi,j+1

(2)

Bonne nouvelle : GPU grent les nombres dnormaliss en matriel sans pnalit

C avant C UV2 INF 446 TLCOM Bretagne/Info/HPCAS E E S. E VEN, S. G UELTON & R. K ERYELL 122 / 361

Dclarations

Types des objets

Dclarations

Types des objets

Nombres complexes
Rajout en 99 des ottants en version complexe (en fait sous-ensemble de + i ) Rejoint classe langages scientiques (Fortran) ( oat|[long]double)complex doublecomplex longdoublecomplex Pas dentiers en version complexe (mais extension GCC) Comme pour type bool pour viter conit avec vieilles dclaration propres, via <complex.h>
1 2

(I)

Pointeurs
LA subtilit du langage C ! Variable spciale pour contenir adresse mmoire dun objet
1

(I)

type *identifiant;

dnit identiant comme variable de type pointeur vers type Profondeur arbitraire : on peut aussi manipuler adresse de cette variable
1

char *** v ;

# d e f i n e complex _Complex # d e f i n e _Complex_ I _ _ e x t e n s i o n _ _ 1.0 iF ) ( # d e f i n e I _Complex_I

Stocks en mmoire comme concatnation partie relle et imaginaire Mais vraie opration interne Type _Imaginary et imaginary aussi
C avant C UV2 INF 446 TLCOM Bretagne/Info/HPCAS E E S. E VEN, S. G UELTON & R. K ERYELL 123 / 361

est une variable de type pointeur vers une variable de type pointeur vers une variable de type pointeur vers une variable de type char
v

Corollaire : impose/implique en gnral objet point en mmoire et non en registre ( optimisation )


C avant C UV2 INF 446 TLCOM Bretagne/Info/HPCAS E E S. E VEN, S. G UELTON & R. K ERYELL 124 / 361

Dclarations

Types des objets

Dclarations

Types des objets

Pointeurs

(II)

Vecteurs

(I)

Suite ordonne dobjets de mme type Dclarer une variable de type pointeur alloue la place pour ladresse, ne dclare pas objet point ni alloue place mmoire pour objet point erreur de dbutant... Dclaration du style
1

typeidentifiant[dim1 ][dim2 ] [dimn ];

http://cslibrary.stanford.edu/104 Les pointeurs en pte modeler

Premier lment commence 0 dans chaque dimension ( 1 en Fortran par dfaut...), donc espace de dnition Didentiant = [0,dim1 1] [0,dim2 1] [0,dimn 1] n Identiant assimil un pointeur vers premier lment

C avant C UV2 INF 446 TLCOM Bretagne/Info/HPCAS E E S. E VEN, S. G UELTON & R. K ERYELL 125 / 361

C avant C UV2 INF 446 TLCOM Bretagne/Info/HPCAS E E S. E VEN, S. G UELTON & R. K ERYELL 126 / 361

Dclarations

Types des objets

Dclarations

Types des objets

Vecteurs

(II)

Vecteurs

(III)

Stockage contigu en mmoire. En multidimensionnel : varie plus contraire de Fortran). lentement sur dernire dimension ( Adresse lment ai1 ,i2 ,...,in = a0 + (( (i1 dim2 + i2 ) )dimn2 + in1 )dimn + in sizeof(type)
1

En C99 taille de tableau dynamique autorise (comme en Fortran)


1

i n t f( i n t n){ double matrice [ n *2][ n *3]; ... }

f l o a t a [2][3]

rang en mmoire : a[0][0] a[0][1] a[0][2]

a[1][0]

a[1][1]

a[1][2]

C99 simplie normment programmation C Programmes plus propres Allocation dans un bloc ( dans la pile) Alternative intressante alloca()

Important si mlange plusieurs langages ou optimisations

C avant C UV2 INF 446 TLCOM Bretagne/Info/HPCAS E E S. E VEN, S. G UELTON & R. K ERYELL 127 / 361

C avant C UV2 INF 446 TLCOM Bretagne/Info/HPCAS E E S. E VEN, S. G UELTON & R. K ERYELL 128 / 361

Dclarations

Types des objets

Dclarations

Types des objets

Vecteur en paramtre de fonction


Vecteur pass en tant quadresse sur premier lment (identiant vu prcdemment) Comme nimporte quel paramtre en C : passage par copie... dune adresse ici !
K Mais partir de cette adresse, accs aux lments modier lments dun vecteur !
1 2

(I)

Vecteur en paramtre de fonction


Possibilit en C99 de prciser au compilateur que vecteur pass existe en mmoire et a au moins cette taille (vrication anti-dbordement)
1 2

(II)

on peut

v o id affiche ( double v [ s t a t i c N ]) { ... }

v o id affiche ( double v []) { ... } ... affiche ( v );

En multidimensionnel, calcul dadresse lment dpend taille Obliger de passer tailles dimensions dimension 2... concernes (dj en Fortran, nouveau en C99)
1

a Astuce : si on veut passer tous les lments par copie, mettre vecteur dans une structure

v o id affiche ( double matrice [ X ][ Y ]) { ... }

Comme en mono-dimensionnel simple suite dlments doublev[] ou double*v font laffaire


C avant C UV2 INF 446 TLCOM Bretagne/Info/HPCAS E E S. E VEN, S. G UELTON & R. K ERYELL 129 / 361

Nouveau aussi en C99, tailles variables & passables en paramtres (idem Fortran)
C avant C UV2 INF 446 TLCOM Bretagne/Info/HPCAS E E S. E VEN, S. G UELTON & R. K ERYELL 130 / 361

Dclarations

Types des objets

Dclarations

Types des objets

Vecteur en paramtre de fonction

(III)

Chane de caractres

(I)

Interaction avec monde extrieur caractres


1

besoin de chanes de

v o id affiche ( i n t x , i n t y , double matrice [ x ][ y ]) { ... }

Sens de lconomie du C : ne pas rajouter type spcial dans langage (= string en Basic ou Java) Besoin dune convention collective
Chane en C = vecteur de caractres Pas de stockage de la taille contrairement Fortran, BASIC, Java, PERL, Python... Fin de chane = caractre nul (\0) Constructeur de chane constante dans le langage qui met le \0 nal

C avant C UV2 INF 446 TLCOM Bretagne/Info/HPCAS E E S. E VEN, S. G UELTON & R. K ERYELL 131 / 361

C avant C UV2 INF 446 TLCOM Bretagne/Info/HPCAS E E S. E VEN, S. G UELTON & R. K ERYELL 132 / 361

Dclarations

Types des objets

Dclarations

Types des objets

Chane de caractres
1

(II)

Chane de caractres

(III)

char chaine [] = " r i e n " ;

Alloue en mmoire les caractres r i e n \0 rien est de type tableau ou pointeur vers caractre

Bien comprendre cette convention ! ! !


Si on copie une chane dans une autre, vrier quil y a de la place, y compris pour le \0 nal ! Sinon : crabouillage dautre donnes... Ne pas oublier le \0 nal ! ! ! Sinon
Caractres suivre inclus dans chane jusquau prochain \0 (fuite dinformation condentielle) Caractres suivre dans une zone mmoire inexistante (erreur mmoire n de programme)

Sens de lconomie du C : pas de vrication de type, de taille de chane,... Erreurs de programmation sources principales de piratages en C Penser la fonction standard de copie avec allocation mmoire strdup() (fonction la plus importante du langage C ! )

C avant C UV2 INF 446 TLCOM Bretagne/Info/HPCAS E E S. E VEN, S. G UELTON & R. K ERYELL 133 / 361

C avant C UV2 INF 446 TLCOM Bretagne/Info/HPCAS E E S. E VEN, S. G UELTON & R. K ERYELL 134 / 361

Dclarations

Types des objets

Dclarations

Types des objets

Chanes de caractres larges


Internationalisation et caractres larges Constantes Larges
1

(I)

Structures de donnes

(I)

wchar_t g r o s s e _ c h a i n e [] = L " t r s g r o s "

Regroupement local squentiel dobjets C htrognes Dclaration dobjets


1

Pour communiquer avec monde extrieur, caractres larges (exemple UNICODE) codables en suite (entire) de caractres simples (exemple UTF-8)
Dans comits de normalisation, dnir des srialisations compatibles avec formats chanes de caractre de tous ( ?) langages de programmation caractres UTF-8 autres que caractre nul ne contient pas de \0 Choisir des srialisations qui respecte ordre lexicographique de comparaison des caractres : possible de trier avec mme rsultat quUNICODE caractres larges avec fonction sur chanes de caractres simples codage UTF-8
C avant C UV2 INF 446 TLCOM Bretagne/Info/HPCAS E E S. E VEN, S. G UELTON & R. K ERYELL 135 / 361

s t r u c t { double x ; double y ; i n t couleur ; }p;

Pnible si on veut dclarer de nombreuses variables de ce type...

C avant C UV2 INF 446 TLCOM Bretagne/Info/HPCAS E E S. E VEN, S. G UELTON & R. K ERYELL 136 / 361

Dclarations

Types des objets

Dclarations

Types des objets

Structures de donnes
Dclaration pralable de type
1

(II)

Structures de donnes
1 2

(III)

s t r u c t search_li st { t_search_buffer search_buffer; char * key ; s t r u c t search_lis t * next ; };

s t r u c t vecteur { size_t taille ; double contenu []; }

puis dclaration de variables de ce type


1

Simplie structures de donnes (pas oblig de passer par objet supplmentaire avec pointeur dessus) Allocation concrte dans la machine non spcie...
Pour des raisons de limitations matrielles ou optimisation on peut utiliser plus de mmoire que somme de taille des champs des extensions avec pragmas dalignement (GCC) comme
1

s t r u c t search_li st * s ; s t r u c t search_li st search_li st ; search_lis t . key = " b a s e " ; search_lis t . next = NULL ;

Espace de nommage des types structures et de nommage des pas de conit possible variables distinct Possible de dclarer dun coup 1 type et 1 variable Dans C99 possible de faire des structures non nies en terminant par vecteur de taille indnie
C avant C UV2 INF 446 TLCOM Bretagne/Info/HPCAS E E S. E VEN, S. G UELTON & R. K ERYELL 137 / 361

s t r u c t S { s h o r t f [3]; } _ _ a t t r i b u t e _ _ (( aligned (8)));

Nanmoins ordre respect en mmoire et si dbut commun dans 2 structures, stockage mmoire du dbut identique (utile pour unions)

C avant C UV2 INF 446 TLCOM Bretagne/Info/HPCAS E E S. E VEN, S. G UELTON & R. K ERYELL 138 / 361

Dclarations

Types des objets

Dclarations

Types des objets

Type dunion de types

(I)

Type dunion de types

(II)

Besoin de pouvoir stocker diffrents types dobjets dans une variable Contrairement aux structures, champs exclusifs
1

union [nom-union] { (type champ;)+ } identifiant;

viter suppositions de stockage (stockage des entiers par gros bout ou petit bout), de compactage, doptimisation...

11

enum stockage { Entier , Flottant }; s t r u c t element { enum stockage type ; union { i n t i ; double d ; } valeur ; // F a c u l t a t i f }e; e . type = Entier ; e . valeur . i = 3; e . type = Flottant ; e . valeur . d = -3.87 e -7;

On aurait pu aussi supprimer valeur dans structure car pas dambigut sur i ou d

C avant C UV2 INF 446 TLCOM Bretagne/Info/HPCAS E E S. E VEN, S. G UELTON & R. K ERYELL 139 / 361

C avant C UV2 INF 446 TLCOM Bretagne/Info/HPCAS E E S. E VEN, S. G UELTON & R. K ERYELL 140 / 361

Dclarations

Types des objets

Dclarations

Types des objets

Type dunion de types

(III)

Champs de bits
Champ de Structure
Stockage plus compact taill au bit prs Permet de cadrer des spcicits matrielles (priphriques, registres de contrle...)

(I)

Peut tre utilis pour rcuprer/traduire/(d)srialiser/convertir donnes, protocoles,... On crit avec un type, on lit avec un autre Bien mettre des gardes testant machine cible car programme non portable...

Dans /usr/src/linux-2.6.13/drivers/net/sundance.c
1 2

s t r u c t netdev_private{ // . . . unsigned i n t flowctrl :1; unsigned i n t d e f a u l t _ p o r t :4; / L as t dev>i f _ p o r t v a l u e . / unsigned i n t an_enable :1; / . . . / }

Ncessite gnralement plus de temps daccs que le type natif compromis espace-temps arrondi au dessus en taille Pas type natif = pas dadresse spcique donc pas de pointeur possible sur un champ de bits
C avant C UV2 INF 446 TLCOM Bretagne/Info/HPCAS E E S. E VEN, S. G UELTON & R. K ERYELL 141 / 361 C avant C UV2 INF 446 TLCOM Bretagne/Info/HPCAS E E S. E VEN, S. G UELTON & R. K ERYELL 142 / 361

Dclarations

Types des objets

Dclarations

Types des objets

Champs de bits

(II)

Autres types standards

(I)

nombreux types dnis dans bibliothques standard du C Taille limite celle dun entier extensions de C permettant champs de bits hors structure (synthse matrielle...) Voir les manuels (man, woman sous Emacs...), info (C-h i sous Emacs...) size_t pour dnir des tailles (style sizeof()) ptrdiff_t pour diffrences de pointeurs fpos_t pour position dans chier ...

C avant C UV2 INF 446 TLCOM Bretagne/Info/HPCAS E E S. E VEN, S. G UELTON & R. K ERYELL 143 / 361

C avant C UV2 INF 446 TLCOM Bretagne/Info/HPCAS E E S. E VEN, S. G UELTON & R. K ERYELL 144 / 361

Dclarations

Types des objets

Dclarations

Types des objets

Types de fonctions

(I)

Types de fonctions

(II)

Ncessit en C de dclarer tout objet avant utilisation, y compris fonction Compilation en units spares (bibliothques...) ou rcursion : savoir appeler une fonction sans avoir sa dnition complte
1 2

Types de fonction : signature dappel


v o id affiche2 ( i n t x , i n t y , double matrice [ x ][ y ]); v o id affiche3 ( i n t , i n t , double *);

est une fonction dnie dans une autre unit de compilation (extern) et renvoie un int . La fonction prend une chane de caractre de type format, sengage ne pas la modier (const) et il ny aura pas daliasing dessus en local (restrict). Ensuite, viennent paramtres optionnels
printf

Premire dclaration plus explicite prfrer affiche2 pointe vers une adresse de fonction dnie ailleurs Dclaration type de fonction avec paramtres optionnels
1

e x t e r n i n t printf ( const char * restrict __format , ...);

C avant C UV2 INF 446 TLCOM Bretagne/Info/HPCAS E E S. E VEN, S. G UELTON & R. K ERYELL 145 / 361

C avant C UV2 INF 446 TLCOM Bretagne/Info/HPCAS E E S. E VEN, S. G UELTON & R. K ERYELL 146 / 361

Dclarations

Types des objets

Dclarations

Types des objets

Types incomplets

(I)

Types incomplets
Utiliser pour pointer vers nimporte quoi Sens de lconomie du C : doit tre transform en autre type de pointeur avant drfrencement car mmoire pas type en C (contrairement au LISP, Python, PERL...) Dclaration de procdures et/ou de fonctions sans paramtre
1

(II)

Vecteur dont premire dimension non dimensionne Dclaration du seul nom de structure : type opaque de bibliothque cache au programmeur. Dans (pseudo)X11
1 2

s t r u c t _XDisplay ; ... s t r u c t _XDisplay * d = OpenDispl ay (...); ... Dessine (d , ...);

Programme utilisateur peut rcuprer et passer en paramtre d qui pointe vers donne opaque Pointeur encore plus opaque
1

/ Ne r e n v o i e r i e n : une pr oc du r e en f a i t / v o id begin_time r ( v o id / Pas d argument / ) { g e t t i m e o f d a y (& time_begin , NULL ); }

Ne prcise pas les arguments


1

v o id * p ;

i n t u n e _ v a g u e _ f o n c t i o n ();

C avant C UV2 INF 446 TLCOM Bretagne/Info/HPCAS E E S. E VEN, S. G UELTON & R. K ERYELL 147 / 361

C avant C UV2 INF 446 TLCOM Bretagne/Info/HPCAS E E S. E VEN, S. G UELTON & R. K ERYELL 148 / 361

Dclarations

Types des objets

Dclarations

Types des objets

FAQ Composition oprateurs de dclaration


Compliqu en C car syntaxe trop obscure sur ce point, mlange doprateurs prxs, postxs, de priorit...

(I)

FAQ Composition oprateurs de dclaration


Oprateurs [] et () prioritaires sur oprateur * Sens de lconomie du C : utiliser parenthses pour changer Aux dpens des neurones du programmeur... priorit !
Comment dclarer pointeur de fonction (utile pour faire dlgation, programmation objet en... C ) ?
1

(II)

Avec langage C parallle MPL (plural en plus...) venait outil transformant description de type en anglais en type C/MPL Matriau de base
* dclare pointeurs [] dclare vecteurs/matrices () dclare une fonction

i n t (* p )()

rapproche pointeur de p Comment dclarer pointeur vers matrice de double ?


1

Comment dclarer tableau de pointeur ?


1

double (* p_matrice )[ N ][ M ]

char * argv [];

typiquement tableau de chanes de caractres Comment dclarer fonction qui renvoie pointeur ?
1

Ide gnrale : partir de la variable et appliquer oprateurs pour rafner type en rajoutant parenthses si besoin est
Pointeur de fonction qui renvoie un pointeur vers un int et prend en paramtre un vecteur de double et un pointeur de fonction qui renvoie un pointeur vers un oat et prend en paramtre un pointeur vers un tableau de char

v o id * malloc ( size_t size );

C avant C UV2 INF 446 TLCOM Bretagne/Info/HPCAS E E S. E VEN, S. G UELTON & R. K ERYELL 149 / 361

C avant C UV2 INF 446 TLCOM Bretagne/Info/HPCAS E E S. E VEN, S. G UELTON & R. K ERYELL 150 / 361

Dclarations

Types des objets

Dclarations

Porte

FAQ Composition oprateurs de dclaration

(III)

Le plan
1

1 2

*p (* p )() i n t * (* p )() i n t * (* p )( double [] , f l o a t *(*)( char (*)[])));

2 3

Devient rapidement cryptique... (typedef)

passer par type intermdiaires

Pas possible de combiner vecteurs et fonctions directement (pas de vecteur de fonction, de fonction de fonction, de fonction qui renvoie un vecteur,...) Mais comme on peut passer par des pointeurs... Programmation par essai-erreur peut aider

Introduction Bibliographie Petite histoire Langage Gnralits Un ordinateur ? Mais quest-ce ? Les bases de la numrologie Calcul binaire Dclarations Gnralits Types des objets Porte Expressions Smantique oprateurs Coercition de type Instructions Prprocesseur Bibliothques

9 10 11 12

13

14

6 7 8
C avant C UV2 INF 446 TLCOM Bretagne/Info/HPCAS E E S. E VEN, S. G UELTON & R. K ERYELL 151 / 361

15 16 17

Modle mmoire & allocation Entres-sorties GNOME diteur exemple dEmacs Tuning de son clavier Compilation Modularisation Mise au point Dvermineur (debugger) Analyse mmoire Extensions Du C pour le graphisme C++ Dlires Le btisier Concours de programmes incomprhensibles Conclusion Index Table des matires

C avant C UV2 INF 446 TLCOM Bretagne/Info/HPCAS E E S. E VEN, S. G UELTON & R. K ERYELL 152 / 361

Dclarations

Porte

Dclarations

Porte

Porte des dclarations

(I)

Porte des dclarations


1

(II)

# include < s t d i o . h> # include < s t d l i b . h> double f i b o n a c c i ( double n ) { r e t u r n n <= 1 ? 1 : f i b o n a c c i ( n 1 ) + f i b o n a c c i ( n 2 ) ; } i n t main ( i n t argc , const char argv [ s t a t i c 2 ] ) { double v = a t o f ( argv [ 1 ] ) ; ( void ) p r i n t f ( " Fibonacci(% f ) =%f \n" , v , f i b o n a c c i ( v ) ) ; return 0; }

Porte (scope) : domaine daccessibilit des objets Besoin davoir variables locales
Programmation plus claire Moins de conits dans gros programmes
1 2

f o r ( i n t i = 0; ...) { ... f o r ( i n t i = 0; ...) ... }

11

si oubli de redclarer variable locale boucle interne... Rcursion

Principe de base : objet dclar dans un bloc visible dans ce bloc et bloc imbriqu
Pas visible depuis bloc extrieur

utiliser pour de meilleurs causes (complexit en O(2n ) que mathmatiquement puissance de matrice aprs diagonalisation matrice de suite en O(log n)...)

ici alors

C avant C UV2 INF 446 TLCOM Bretagne/Info/HPCAS E E S. E VEN, S. G UELTON & R. K ERYELL 153 / 361

C avant C UV2 INF 446 TLCOM Bretagne/Info/HPCAS E E S. E VEN, S. G UELTON & R. K ERYELL 154 / 361

Dclarations

Porte

Dclarations

Porte

Porte des dclarations


Masquable par dclaration dun identiant de mme non dans un bloc imbriqu
1 2

(III)

Porte des dclarations

(IV)

i n t i = 6; { // i v a u t 6 i c i { double i = 9; // i v a u t 9 . 0 i c i } // i v a u t de nouveau 6 }

Rajout mot-cl extern devant dclaration pour dire que dclaration de ce chier nest pas la vraie . Code derreur fonctions UNIX <errno.h>
1

e x t e r n i n t errno ;

Gnant dans gros programmes : risque de conits ! espaces de nommage en C++)

Corollaire : tout objet dclar en dehors dun bloc (donc les fonctions) est global au programme
Tout objet doit tre dclar en C avant usage Si utilisation dans plusieurs chiers, dclaration ( identique...) dans plusieurs chiers Mais o se trouve la vraie version ? O est le stockage de la variable ?

Dclaration dobjets locaux lunit de compilation (chier) en rajoutant mot-cl static


Sens de lconomie du C : rutilisation de static pour un autre usage que son sens premier... Syntaxe cryptique

C avant C UV2 INF 446 TLCOM Bretagne/Info/HPCAS E E S. E VEN, S. G UELTON & R. K ERYELL 155 / 361

C avant C UV2 INF 446 TLCOM Bretagne/Info/HPCAS E E S. E VEN, S. G UELTON & R. K ERYELL 156 / 361

Dclarations

Porte

Dclarations

Porte

O dclarer les variables


Diffrentes religions Dclaration en tte de fonctions
Prsentation + centralise des variables Si on a besoin dutiliser valeur existante quelque part : on lutilise tout simplement Pollue espace de nommage

(I)

Vie relle des objets


Porte syntaxique : ce que programmeur veut... Programme compil et optimis
Si possible garder objets souvent dans registres processeurs (jamais assez nombreux ) Possible de conseiller compilateur de garder variable souvent utilise en registre en rajoutant register dans dclaration Un mme registre va stocker plusieurs objets diffrents et de types diffrents au cours de lexcution Compilateur essaye doptimiser en utilisant graphe de dpendance, analyses de dure de vie, heuristiques... Optimiser tout en prservant smantique du programme Porte syntaxique = diffrente Si dverminage (debug) du code, acte de dieu (non prvu par compilateur...) qui manipule variables du programme avec porte syntaxique et non relle Pas forcment bonnes valeurs afches !
C avant C UV2 INF 446

(I)

Dclaration au plus tard et rajout de blocs pour limiter porte


vite de polluer espace de nommage Moins de visibilit en dbut de fonction sur ce qui est manipul Si modication de programme et besoin valeur variable en dehors de sa visibilit : remonter dclaration variable au niveau bloc concern. si masquage dans blocs plus internes... viter nanmoins de jouer sur les masquage pour sant mentale des relecteurs...

C avant C UV2 INF 446 TLCOM Bretagne/Info/HPCAS E E S. E VEN, S. G UELTON & R. K ERYELL 157 / 361

TLCOM Bretagne/Info/HPCAS E E

S. E VEN, S. G UELTON & R. K ERYELL

158 / 361

Dclarations

Porte

Dclarations

Porte

Vie relle des objets

(II)

Vie relle des objets


Variables dans un bloc et paramtres de fonction
Existence interne au bloc Automatiquement alloues dans pile (attribut par dfaut auto)

(III)

Possible de prciser quune variable peut avoir son tat chang en mmoire (priphrique matriel, DMA, programmation multithread, multi-processus avec segment mmoire partage...) avec volatile rajout dans dclaration synchronisation ne entre tat interne (registres & caches) et mmoire... Performances...

taille de pile parfois limite erreur de segmentation en cas de dpassement (man getrlimit et shell) Pile trs spciale dans certains micro-contrleurs... Possible davoir variables statiques (non automatique) dans fonctions Permet de garder tat dun appel lautre
1 2

i n t j o l i e _ f u n c t i o n (...) { s t a t i c i n t n o m b r e _ d e _ j o l i s _ a p p e l s = 0; ... n o m b r e _ d e _ j o l i s _ a p p e l s ++ ... } Initialisation excute quune seule fois (heureux !) En tenir compte en cas de rcursivit

C avant C UV2 INF 446 TLCOM Bretagne/Info/HPCAS E E S. E VEN, S. G UELTON & R. K ERYELL 159 / 361

C avant C UV2 INF 446 TLCOM Bretagne/Info/HPCAS E E S. E VEN, S. G UELTON & R. K ERYELL 160 / 361

Dclarations

Porte

Dclarations

Porte

Vie relle des objets

(IV)

Objets non modiables

(I)

Ne pas utiliser dadresse vers objets automatiques en bugs dehors de leur bloc de visibilit : contenu mmoire indni sordides (si interruption...)

Qualicatif const dans dclaration


1

i n t const taille = 100;

Allocation dynamique permanente (cf. malloc() et autres) Extension C99 : Thread-local storage (TLS) pour avoir une instance par thread dans un programme parallle
1

utiliser de prfrence des car entit de premire classe du langage (connue par dbogueur...) Subtilit avec pointeurs : est-ce pointeur ou ce qui est point qui est constant ?
Avant * (loign identiant pointeur) : ce qui est point est constant
1

__thread i n t i ;

Cf discussion
http://www.open-std.org/jtc1/sc22/wg14/www/docs/n1364.htm http://en.wikipedia.org/wiki/Thread-local_storage

const char * m e s s a g e _ b i e n v e n u e = " Bonjour ! " ;

Aprs * (proche identiant pointeur) : pointeur constant


1

Souvent sujet chaud des langages (comparer en PERL my et local !)

double * const v e c t e u r _ s t a n d a r d = le_vecteur ;

Rien nempche le contenu de le_vecteur dtre modi

C avant C UV2 INF 446 TLCOM Bretagne/Info/HPCAS E E S. E VEN, S. G UELTON & R. K ERYELL 161 / 361

C avant C UV2 INF 446 TLCOM Bretagne/Info/HPCAS E E S. E VEN, S. G UELTON & R. K ERYELL 162 / 361

Dclarations

Porte

Dclarations

Porte

Objets non modiables

(II)

Des pointeurs problmes...

(I)

Nanmoins combinable avec volatile : pas modi par ce programme mais monde extrieur (variables denvironnement, tic dhorloge...)
e x t e r n const v o l a t i l e long i n t t i c _ h a r d w a r e _ c o u n t e r ;

Problme daccs aux donnes par pointeur ou directement en mmoire : difcile pour compilateur de comprendre ce qui se passe (et pour programmeur ? ) Phnomne daliasing : 2 pointeurs diffrents peuvent concerner une zone mmoire commune... Quid si pour optimiser, objet point mis en registre et modication par ailleurs objet en mmoire via pointeur ? Contourner les problmes ?
Java : pas de pointeurs explicites Fortran : alias interdits par la norme

C avant C UV2 INF 446 TLCOM Bretagne/Info/HPCAS E E S. E VEN, S. G UELTON & R. K ERYELL 163 / 361

C avant C UV2 INF 446 TLCOM Bretagne/Info/HPCAS E E S. E VEN, S. G UELTON & R. K ERYELL 164 / 361

Dclarations

Porte

Dclarations

Porte

Exemple de C : pointeurs
Compliquent (empchent ?) analyses automatiques Donc moins doptimisations
1

(I)

Exemple de C : aliasing

(I)

Deux rfrences (pointeurs) sur une mme zone


1 2

p=&a; i f ( b > 0) p=&b; * p = 5;

v o id init ( i n t size , f l o a t array [ size ] , f l o a t * val ) { f l o a t * end = array + size ; w h i l e ( array < end ) * array ++ = * val + 1.0; }

Lequel de a ou b vaudra 5 ? Peut tre optimis en


1 2

Stockage de ladresse de val en registre, et recharge chaque tour car ventuellement dans array ! Quid si val=&array[3] ? Parade ? const ? register explicite ? Pas toujours possible... Rajouter un test et crire 2 codes diffrents :

i f ( b > 0) b = 5; else a = 5;

si compilateur comprend les pointeurs...

C avant C UV2 INF 446 TLCOM Bretagne/Info/HPCAS E E S. E VEN, S. G UELTON & R. K ERYELL 165 / 361

C avant C UV2 INF 446 TLCOM Bretagne/Info/HPCAS E E S. E VEN, S. G UELTON & R. K ERYELL 166 / 361

Dclarations

Porte

Dclarations

Porte

Exemple de C : aliasing
1 2

(II)

Pointeurs restreint
Nouveaut de C99 Garantir au compilateur quil ny aura pas daliasing : restrict Exemple prcdent
1 2

(I)

10

12

14

v o id init ( i n t size , f l o a t array [ size ] , f l o a t * val ) { f l o a t * end = array + size ; f l o a t v = * val + 1.0; i f ( val >= array && val < end ) { //Cas pr ob l m e : w h i l e ( array <= val ) * array ++ = v ; v += 1.0; w h i l e ( array < end ) * array ++ = v ; } else { //Pas de pr ob l m e : w h i l e ( array < end ) * array ++ = v ; } }

v o id init ( i n t size , f l o a t array [ size ] , f l o a t * restrict val )

Bibliothques
1

# i n c l u d e < string .h > v o id * memcpy ( v o id * restrict dest , const v o id * restrict src , size_t n ); v o id * memmove ( v o id * dest , const v o id * src , size_t n );

Solution si on sait que ce cas narrivera jamais : le dire au compilateur pointeurs restreints

Dans memmove() 2 zones peuvent se chevaucher...


C avant C UV2 INF 446

C avant C UV2 INF 446 TLCOM Bretagne/Info/HPCAS E E S. E VEN, S. G UELTON & R. K ERYELL 167 / 361

TLCOM Bretagne/Info/HPCAS E E

S. E VEN, S. G UELTON & R. K ERYELL

168 / 361

Dclarations

Porte

Dclarations

Porte

Nommage de type
Dclarer des types complexes (tableaux de pointeurs de fonctions...) : compliqu Trimbaler des structs, unionu ou enume dans chaque dclaration : lourd
1 2 4 6 8 10 12 14 16 18 struct ar br e_binair e { / o mi lnyapasle Cm e mot structdevantgauche,c estletypede l espacede ommage n classiquequiestutilis ,enl occurrence le typedutypedef:/ a r b r e _ b i n a i r e gauche ; //Tailleconnuecaronsaitquecestunpointeur! arbre_binaire droite ; //Accrochenimportequeltypedevaleurl arbre typedef double m a t r i c e [ N ] [ M ] ; matrice a , b ; //Letypenestpasforcmentencoredfini: typedef s t r u c t a r b r e _ b i n a i r e a r b r e _ b i n a i r e ;

(I)

Nommage de type

(II)

Dclaration de types nomms par typedef


# i ncl ude < s t d l i b . h>

20 22 24 26

void v a l e u r ; } ar br e1 ; //arbre1estunlment //Dclareunpointeurversunnoeuddel arbre: a r b r e _ b i n a i r e par br e2 ; / n O pourraallouerunvraiarbreplustardavecparexemple: parbre2 malloc(sizeof(structarbre_binaire)); = parbre2 > gauche parbre2 > = droit parbre2 > = valeur U L =N L ; /

Ressemble dclaration de variable


enum {N = 1000 , M = 10000};

C avant C UV2 INF 446 TLCOM Bretagne/Info/HPCAS E E S. E VEN, S. G UELTON & R. K ERYELL 169 / 361

C avant C UV2 INF 446 TLCOM Bretagne/Info/HPCAS E E S. E VEN, S. G UELTON & R. K ERYELL 170 / 361

Dclarations

Porte

Dclarations

Porte

Expression de type
Besoin dexpression de type anonyme Dclarations de prototypes de fonctions plus cours Utile si besoin de connatre taille dun type Sobtient simplement en supprimant nom de variable dclaration
1

(I)

Expression de type

(II)

11

( gdb ) print s i z e o f ( double [10]) $1 = 80 *( gdb ) print s i z e o f ( double *[10]) $2 = 40 *( gdb ) print s i z e o f ( double (*)[10]) $3 = 4 *( gdb ) print s i z e o f ( double *(*)[10]) $4 = 4 *( gdb ) print s i z e o f ( double *(*)()) $5 = 4 *( gdb ) print s i z e o f ( double (*[10])( i n t , f l o a t )) $6 = 40

sizeof() peut servir de moyen de vrication du type quon a voulu crer... :-)

C avant C UV2 INF 446 TLCOM Bretagne/Info/HPCAS E E S. E VEN, S. G UELTON & R. K ERYELL 171 / 361

C avant C UV2 INF 446 TLCOM Bretagne/Info/HPCAS E E S. E VEN, S. G UELTON & R. K ERYELL 172 / 361

Dclarations

Porte

Dclarations

Porte

Initialisations de variables

(I)

Initialisations avec types compliqus


Initialisation de vecteurs
1 2

(I)

Variables peuvent tre initialises lors de leur dclaration vite dutiliser variables non initialises, programme plus clair Contrainte : valeur dinitialisation doit tre une constante (valuable par compilateur et diteur de lien)
1 2

4 6 8 10 12

/chaineest untableauenmmoireglobale dont l e slments sont i n i t i a l i s s valeurdescaractres/ char chaine [ ] = "abougepourmoi" ; char s t u d i e u x [ ] = { p , , n , i , b , l , e , \0 } ; //Onauraitpu fa ir e pire avecstudieux [ 8 ] ! /chaine_immuableest unpointeurversunechaneconstante dans l e sinstructionsduprogramme. . . / char chaine_immuable = "dans l e code ! " ; int matrice [ 2 ] [ 3 ] = { { 1, 2, 3 } , { 4, 5, 6 } };

char chaine [] = " b o n j o u r " ; double vieux_pi = 22.0/7.0; // R s ol u par d i t e u r de l i e n : char ** p = & chaine ;

Initialisations incompltes en C99


1

double g r o s _ v e c t e u r [1000000] = { 4.5 , 5.6 , [123456] = 7.89 E -10 , [500000] = 4.6 };

C avant C UV2 INF 446 TLCOM Bretagne/Info/HPCAS E E S. E VEN, S. G UELTON & R. K ERYELL 173 / 361

C avant C UV2 INF 446 TLCOM Bretagne/Info/HPCAS E E S. E VEN, S. G UELTON & R. K ERYELL 174 / 361

Dclarations

Porte

Dclarations

Porte

Initialisations avec types compliqus

(II)

Initialisations avec types compliqus


1

(III)

Par dfauts, lments non spcis sont mis 0 Si tout 0, optimisation : non stockage des valeurs Comparer avec
1

double g r o s _ v e c t e u r _ d e _ n u l s [1000000];
9

enum stockage { Entier , Flottant }; typedef s t r u c t { enum stockage type ; union { i n t i ; double d ; } valeur ; // F a c u l t a t i f } element ; element e = { . type = Entier , . valeur . i = 3 }; typedef s t r u c t { i n t x , y ; } vecteur [10]; vecteur v = { {1,3},

Occupation mmoire :
-rw-r--r--rw-r--r--rw-r--r--rw-r--r-1 1 1 1 keryell keryell keryell keryell keryell 56 2005-11-06 11:06 keryell 8000709 2005-11-06 11:06 keryell 38 2005-11-06 11:08 keryell 713 2005-11-06 11:08 gros_vecteur.c gros_vecteur.o gros_vecteur_de_nuls.c gros_vecteur_de_nuls.o
11 13

Unions & structures : possible de prciser les champs en C99

15

17

19

C avant C UV2 INF 446 TLCOM Bretagne/Info/HPCAS E E S. E VEN, S. G UELTON & R. K ERYELL 175 / 361

C avant C UV2 INF 446 TLCOM Bretagne/Info/HPCAS E E S. E VEN, S. G UELTON & R. K ERYELL 176 / 361

Dclarations

Porte

Dclarations

Porte

Initialisations avec types compliqus

(IV)

Variables temporaires

(I)

21

23

[5] = { . y = 3} , [7] = { . x = 1 , . y = 2 } , {.x=3,.y=4} };

Dclares dans blocs dinstructions Dans code excutable possible dinitialiser avec des expressions qui ne sont pas constantes

C avant C UV2 INF 446 TLCOM Bretagne/Info/HPCAS E E S. E VEN, S. G UELTON & R. K ERYELL 177 / 361

C avant C UV2 INF 446 TLCOM Bretagne/Info/HPCAS E E S. E VEN, S. G UELTON & R. K ERYELL 178 / 361

Expressions

Expressions

Le plan
1

Dnition des expressions


Modle mmoire & allocation Entres-sorties GNOME diteur exemple dEmacs Tuning de son clavier Compilation Modularisation Mise au point Dvermineur (debugger) Analyse mmoire Extensions Du C pour le graphisme C++ Dlires Le btisier Concours de programmes incomprhensibles Conclusion Index Table des matires

(I)

2 3

Introduction Bibliographie Petite histoire Langage Gnralits Un ordinateur ? Mais quest-ce ? Les bases de la numrologie Calcul binaire Dclarations Gnralits Types des objets Porte Expressions Smantique oprateurs Coercition de type Instructions Prprocesseur Bibliothques

9 10 11 12

Constituant lmentaire des instructions dun programme C Expressions dnies rcursivement partir dautres expressions lmentaires ou non Partie qui fait
Gnralement des calculs Mais aussi rien Ou des effets de bord sur la mmoire (critures)

13

14

6 7 8

15 16 17

C avant C UV2 INF 446 TLCOM Bretagne/Info/HPCAS E E S. E VEN, S. G UELTON & R. K ERYELL 179 / 361

C avant C UV2 INF 446 TLCOM Bretagne/Info/HPCAS E E S. E VEN, S. G UELTON & R. K ERYELL 180 / 361

Expressions

Expressions

Expressions lmentaires littrales


Constantes entires
Base 10 (dcimale) : classique ! Base 8 (octale) : utiliser chiffres 0 7 avec un 0 devant 022 = 18 Erreur dinattention et oubli du 0 devant ! Base 16 (hexadcimal) : chiffres dcimaux puis a ou A f ou F avec un 0x ou 0X devant 0Xdeadbeef Extension GCC : 0b101100 pour entrer du binaire Les nombres sont stocks dans lordinateur de manire normalise (binaire) format dentre ! ! ! Constante non signe avec sufxe u ou U 0x23U Type long avec sufxe l ou L 75L Type longlong en doublant sufxe l ou L 29LLU
C avant C UV2 INF 446 TLCOM Bretagne/Info/HPCAS E E S. E VEN, S. G UELTON & R. K ERYELL

(I)

Expressions lmentaires littrales


Constantes ottantes
Notation scientique avec chiffres avec . - et ventuellement e ou E pour prciser lexposant en puissance de dix -6.023E-23 Nouveau en C99, ottants prciss en hexadcimal, exposant en puissance de 2 prcis par p ou P (le E est dj pris par hexadcimal... ) -0xe.fP-3 vaut 14.9375 23 = 1.8671875 Permet de prciser exactement constantes ottantes sans approximation base 10 vers base 2 aprs virgule... Par dfaut type double, mais modication de prcision possible
Sufxe f ou F pour oat Sufxe l ou L pour longdouble

(II)

Sufxes modiants type

Constantes complexes
Entres sous forme dexpression constante 1.2 + 3.4*I

Constante caractre contenu entre 2


C avant C UV2 INF 446 181 / 361 TLCOM Bretagne/Info/HPCAS E E S. E VEN, S. G UELTON & R. K ERYELL 182 / 361

Expressions

Expressions

Expressions lmentaires littrales


Caractre quelconque sauf , \ et newline Caractre avec chappement \, \", \\, \n (newline, \t (tabulation... cf squences du tableau ASCII du transparent 3)) Caractre en octal \123 Caractre en hexadcimal \x7f Caractres UNICODE en hexadcimal \u0123 et \U01230123 nouveau en C99

(III)

Expressions lmentaires littrales

(IV)

1 2

char l o n g u e _ c h a i n e [] = " dbut \ et f i n "; char a u t r e _ c h a i n e [] = " dbut " " et "" f i n ";

Constantes chanes de caractres


Style "une\"chane\"!" de type pointeur vers caractre et valeur adresse vers premier caractre La chane contient le caractre \0 nal ! Chane existe en caractres larges wchar_t comme L"gros" Possible de couper chanes en plusieurs lignes

C avant C UV2 INF 446 TLCOM Bretagne/Info/HPCAS E E S. E VEN, S. G UELTON & R. K ERYELL 183 / 361

C avant C UV2 INF 446 TLCOM Bretagne/Info/HPCAS E E S. E VEN, S. G UELTON & R. K ERYELL 184 / 361

Expressions

Expressions

Expressions lmentaires symbolique

(I)

Constantes agrgats

(I)

numrations : symbole TRUC dans enum{TRUC} Identiant de vecteur : pointeur dadresse constante qui pointe vers premier lment Identiant de fonction : pointeur dadresse constante vers code dbut fonction Labels : extension de GCC pour hacker code machine (compilation la vole...) qui est ladresse du label
1 2

Permet de construire des constantes pour des types union, structures ou vecteurs
1 2

calcule ( ( element ) { . type = Entier , . valeur . i = 3 });

ici : adresse = & ici ;

C avant C UV2 INF 446 TLCOM Bretagne/Info/HPCAS E E S. E VEN, S. G UELTON & R. K ERYELL 185 / 361

C avant C UV2 INF 446 TLCOM Bretagne/Info/HPCAS E E S. E VEN, S. G UELTON & R. K ERYELL 186 / 361

Expressions

Expressions

Constantes L-valeurs (lvalues)

(I)

Constructions dexpression

(I)

Construction rcursive dexpressions partir doprateurs et expressions lmentaires lvalue (L-valeur) est une valeur pouvant apparatre dans une affectation gauche dun = Exemple dutilisation de L-valeur constante comme adresse dun priphrique en mmoire type cran bitmap acceptant des entiers partir adresse (int*)0xE0000000 :
1

Oprateur acceptant o oprande est dit darit o Oprateur darit 1 (unaire) peut tre combin
gauche de loprande, prxe
1

-3

droite de loprande, postxe


1

(( i n t *) 0 xE0000000 )[ pixel ] = couleur ; f ()

Oprateur darit mis entre 2 oprandes : inxe


1

4+5

C avant C UV2 INF 446 TLCOM Bretagne/Info/HPCAS E E S. E VEN, S. G UELTON & R. K ERYELL 187 / 361

C avant C UV2 INF 446 TLCOM Bretagne/Info/HPCAS E E S. E VEN, S. G UELTON & R. K ERYELL 188 / 361

Expressions

Expressions

Priorit des oprateurs

(I)

Priorit des oprateurs


Oprateur Associativit gauche droite droite gauche gauche droite gauche droite gauche droite gauche droite gauche droite gauche droite gauche droite gauche droite gauche droite gauche droite droite gauche droite gauche gauche droite Arit 2 1 2 2 2 2 2 2 2 2 2 2 3 2 2 () [] -> . ! ~ ++ -- + - (type) * & sizeof */% +<< >> < <= > >= == != & ^ | && || a ?b:c = += -= *= /= %= <<= >>= &= ^= |= ,

(II)

viter ambigut au maximum 1+2*3 vaut 9 ou 7 ? Coller aux rgles mathmatiques classiques Gnraliser et rajouter la notion dordre de priorit
Mathmatiquement, * prioritaire par rapport +

Problme lorsquoprateurs de mme priorit en concurrence 1-2+3 vaut 2 ou -4 ? Rajouter notion dassociativit
Associativit de gauche droite : oprateurs arithmtiques classiques Associativit de droite gauche : oprateur - unaire arithmtique classique

Rajouter des parenthses si cela diffre du dfaut ou pour clarier ou assurer En ligne : man operator
C avant C UV2 INF 446

C avant C UV2 INF 446 TLCOM Bretagne/Info/HPCAS E E S. E VEN, S. G UELTON & R. K ERYELL 189 / 361

TLCOM Bretagne/Info/HPCAS E E

S. E VEN, S. G UELTON & R. K ERYELL

190 / 361

Expressions

Expressions

Conversions de type
C est un langage typage statique : types des objets dtermins lors de la compilation Si des types doprandes ne correspondent pas, C dnit des rgles de conversions implicites rajoutes dans le programme
Conversion entier vers ottant
1 2

(I)

Conversions de type

(II)

double a = 3 + 2.5; // a v a u t 5 . 5

Si ce nest pas fait exprs... Mais trs pratique si fait exprs pour arithmtique modulo Conversion pour calcul vers type le plus prcis ...

Conversion ottant vers entier


1 2

i n t i = 2.5; // i v a u t 2

Conversion dans un type plus petit : ne garde que les bits de poids faible qui logent
1 2

char c = 0 x1234 // c v a u t 0 x34


C avant C UV2 INF 446 S. E VEN, S. G UELTON & R. K ERYELL 191 / 361 TLCOM Bretagne/Info/HPCAS E E S. E VEN, S. G UELTON & R. K ERYELL 192 / 361

C avant C UV2 INF 446 TLCOM Bretagne/Info/HPCAS E E

Expressions

Smantique oprateurs

Expressions

Smantique oprateurs

Le plan
1

Oprateur .
Modle mmoire & allocation Entres-sorties GNOME diteur exemple dEmacs Tuning de son clavier Compilation Modularisation Mise au point Dvermineur (debugger) Analyse mmoire Extensions Du C pour le graphisme C++ Dlires Le btisier Concours de programmes incomprhensibles Conclusion Index Table des matires

(I)

2 3

Introduction Bibliographie Petite histoire Langage Gnralits Un ordinateur ? Mais quest-ce ? Les bases de la numrologie Calcul binaire Dclarations Gnralits Types des objets Porte Expressions Smantique oprateurs Coercition de type Instructions Prprocesseur Bibliothques

9 10 11 12

Permet daccder champ de structure ou dunion


1 2

typedef s t r u c t { i n t x , y ; } point ; point a ; a . x = 3; a . y = 5; d = sqrt ( a . x * a . x + a . y * a . y );

13

14

6 7 8

15 16 17

C avant C UV2 INF 446 TLCOM Bretagne/Info/HPCAS E E S. E VEN, S. G UELTON & R. K ERYELL 193 / 361

C avant C UV2 INF 446 TLCOM Bretagne/Info/HPCAS E E S. E VEN, S. G UELTON & R. K ERYELL 194 / 361

Expressions

Smantique oprateurs

Expressions

Smantique oprateurs

Oprateur ->
Si allocation dynamique, souvent construction de type
1 2

(I)

Indiage vecteur et matrices []

(I)

point * p ; p = malloc ( s i z e o f ( point )); (* p ). x = 3; (* p ). y = 5; d = sqrt ((* p ). x *(* p ). x + (* p ). y *(* p ). y ); ... free ( p );

Permet daccder lment dun vecteur ou dune matrice


vecteur[indice]
1 2

# i n c l u d e < stdio .h > i n t main ( i n t argc , char * argv []) { f o r ( i n t i = 0; i < argc ; i ++) printf ( "L argument %d vaut \"% s \"\ n" , i , argv [ i ]); }

Lourd car priorit de . suprieure celle de *


1

Abrviation avec notation ->


p - > x = 3; p - > y = 5; d = sqrt ( p - > x *p - > x + p - > y *p - > y );

Abrviation darithmtique sur pointeur : expressions suivantes quivalentes


1

v [ i ] = 3; *( v + i ) = 3; i [ v ] = 3; // ! ! ! : )

Assez mnmotechnique...

C avant C UV2 INF 446 TLCOM Bretagne/Info/HPCAS E E S. E VEN, S. G UELTON & R. K ERYELL 195 / 361

C avant C UV2 INF 446 TLCOM Bretagne/Info/HPCAS E E S. E VEN, S. G UELTON & R. K ERYELL 196 / 361

Expressions

Smantique oprateurs

Expressions

Smantique oprateurs

Indiage vecteur et matrices []


Gnralisation dans le cas des matrices
1

(II)

Indiage vecteur et matrices []

(III)

identifiant[ dim1 ][dim2 ] [dimn ]

Matrice bidimensionnelle et vecteur de vecteur par exemple saccdent syntaxiquement pareils mais ne sont pas quivalents !
char matrice [2][3] = { { 0 , 1 , 2} , { 0 x10 , 0 x11 , 0 x12 } };

3 1

7fffdfd751b0 7fffdfd751b1 7fffdfd751b2 7fffdfd751b3 7fffdfd751b4 7fffdfd751b5

. . . 00 01 02 10 11 12 . . .

7 matrice[0][0] matrice[0][1] matrice[0][2] matrice[1][0] matrice[1][1] matrice[1][2]

// A p r i o r i beaucoup p l u s dynamique char ** v e c t e u r _ d e _ v e c t e u r ; v e c t e u r _ d e _ v e c t e u r = calloc (2 , s i z e o f ( char *)); v e c t e u r _ d e _ v e c t e u r [0] = calloc (5 , s i z e o f ( char )); // 2me l i g n e p l u s grande v e c t e u r _ d e _ v e c t e u r [1] = calloc (8 , s i z e o f ( char )); v e c t e u r _ d e _ v e c t e u r [1][4] = 7;

C avant C UV2 INF 446 TLCOM Bretagne/Info/HPCAS E E S. E VEN, S. G UELTON & R. K ERYELL 197 / 361

C avant C UV2 INF 446 TLCOM Bretagne/Info/HPCAS E E S. E VEN, S. G UELTON & R. K ERYELL 198 / 361

Expressions

Smantique oprateurs

Expressions

Smantique oprateurs

Indiage vecteur et matrices []


. . . 30 30 a2 01 00 00 00 00 50 30 a2 01 00 00 00 00 . . . 00 00 00 . . . 00 00 00 00 07 . . . C avant C UV2 INF 446 TLCOM Bretagne/Info/HPCAS E E S. E VEN, S. G UELTON & R. K ERYELL

(IV)

Appels de fonctions & procdures


Paramtres effectifs passs par valeur (copis dans paramtres formels de la fonction)
identifiant( expr1 ,...,exprn )

(I)

01a23010 01a23011 01a23012 01a23013 01a23014 01a23015 01a23016 01a23017 01a23018 01a23019 01a2301a 01a2301b 01a2301c 01a2301d 01a2301e 01a2301f

vecteur_de_vecteurs[0] (0000000001a23030) 1

vecteur_de_vecteurs[1] (0000000001a23050)

Fonction ne peut pas modier paramtres effectifs dappel Passer en paramtre adresse de (pointeur vers) quelque chose quon veut modier

Dans le cas de vecteurs, seule adresse est pass (pas de copie dlments)
vecteur_de_vecteurs[0][0] vecteur_de_vecteurs[0][1] vecteur_de_vecteurs[0][2]

01a23030 01a23031 01a23032

Dans le cas de structure, toute la structure est copie performances... mais


1

pratique

Ordre dvaluation des paramtres effectifs non spcie


appel ( affiche ( a ) , affiche ( b ) , affiche ( c ));

01a23050 01a23051 01a23052 01a23053 01a23054

vecteur_de_vecteurs[1][0] vecteur_de_vecteurs[1][1] vecteur_de_vecteurs[1][2] vecteur_de_vecteurs[1][3] vecteur_de_vecteurs[1][4]

non dterministe ! effectifs...


C avant C UV2 INF 446 199 / 361 TLCOM Bretagne/Info/HPCAS E E

si effet de bord dans paramtres

S. E VEN, S. G UELTON & R. K ERYELL

200 / 361

Expressions

Smantique oprateurs

Expressions

Smantique oprateurs

Arithmtique

(I)

Arithmtique binaire
Oprations entre entiers pris bit bit c = a op b, pour chaque bit i :

(I)

Oprateurs classiques sur entiers, ottants et complexes + addition - soustraction (inxe) - ngation (prxe) * multiplication / division (si calculs en entiers, troncature vers 0, quel que soit le signe) % modulo (reste de la division entire dnie prcdemment, oprateur seulement pour des types entiers)

ci = ai opbi

& et boolen (ci = ai bi ) 0b01011(11) 0b01101(13) = 0b1001(9) | ou inclusif boolen (ci = ai bi ) 0b1001(9) 0b101(5) = 0b1101(13) ^ ou exclusif boolen (ci = ai bi ) 0b1001(9) 0b101(5) = 0b1100(12)

C avant C UV2 INF 446 TLCOM Bretagne/Info/HPCAS E E S. E VEN, S. G UELTON & R. K ERYELL 201 / 361

C avant C UV2 INF 446 TLCOM Bretagne/Info/HPCAS E E S. E VEN, S. G UELTON & R. K ERYELL 202 / 361

Expressions

Smantique oprateurs

Expressions

Smantique oprateurs

Arithmtique binaire
~ ngation (ci = ai ), complment restreint Sur un char : 0b11101001 = 0b00010110 Oprateurs de dcalage
<< dcalage gauche nombre de b chiffres binaires a<<b =a 2b

(II)

Arithmtique binaire

(III)

b doit tre positif et de taille compatible avec nombre de bits de a Oprations extrmement puissante qui sait les utiliser !
Robot E=M6 : gestion de port parallle
Mettre 1 bit b 1
1

parallel = parallel | ( 1 << b ); p a r a l l e l _ o u t ( parallel ); Mettre 1 bit b 0

0b101(5)<<2 =0b10100(20) >> dcalage droite nombre de b chiffres binaires a 2b 0b10110(22)>>2 =0b101(5) a>>b = Corollaire subtile : si a est de type sign, les bits rajouts gauches sont la rplication du bit de signe (notation en complment 2)
C avant C UV2 INF 446 TLCOM Bretagne/Info/HPCAS E E S. E VEN, S. G UELTON & R. K ERYELL 203 / 361

1 2

parallel = parallel & ~( 1 << b ); p a r a l l e l _ o u t ( parallel );

Garder b bits de poids faible


1

c = a & ((1 << b ) - 1);

Extraire bits b c de a
1

d = ( a >> b ) & ((1 << ( c + 1 - b )) - 1);

On peut aussi utiliser des champs de bits pour faire ce genre de choses
C avant C UV2 INF 446 TLCOM Bretagne/Info/HPCAS E E S. E VEN, S. G UELTON & R. K ERYELL 204 / 361

Expressions

Smantique oprateurs

Expressions

Smantique oprateurs

Optimisations en binaire

(I)

Optimisations en binaire
1

(II)

Quelques exemples trouvs dans virtualiseur QEMU qui doit implmenter des instructions de processeurs sur dautre processeurs Trouver nombre de 0 binaires en tte dun entier
Si le processeur sait le faire : utiliser instruction assembleur qui peut tre cache dans
1

T0 = _ _ b u i l t i n _ c l z ( T1 );

10

Solution nave en O(n) avec boucle


1

12

f o r ( i n t i = s i z e o f ( i n t )* CHAR_BIT - 1; i >= 0) i f ( ( T1 & (1 << i )) != 0 ) break ; T0 = s i z e o f ( i n t )* CHAR_BIT - 1 - i ;

14

16

Solution astucieuse O(log n) (avec affectations conditionnelles...)

18

/ Binary s e a r c h f o r l e a d i n g z e r o s . / T0 = 1; i f (( T1 >> 16) == 0) { T0 = T0 + 16; T1 = T1 << 16; } i f (( T1 >> 24) == 0) { T0 = T0 + 8; T1 = T1 << 8; } i f (( T1 >> 28) == 0) { T0 = T0 + 4; T1 = T1 << 4; } i f (( T1 >> 30) == 0) { T0 = T0 + 2; T1 = T1 << 2; } T0 = T0 - ( T1 >> 31);

C avant C UV2 INF 446 TLCOM Bretagne/Info/HPCAS E E S. E VEN, S. G UELTON & R. K ERYELL 205 / 361

C avant C UV2 INF 446 TLCOM Bretagne/Info/HPCAS E E S. E VEN, S. G UELTON & R. K ERYELL 206 / 361

Expressions

Smantique oprateurs

Expressions

Smantique oprateurs

Optimisations en binaire

(III)

Applications codage binaire : multispin-coding


Exploitation du paralllisme en bits Ranger plusieurs petites donnes par mot machine

(I)

Exemple du comptage de population de 1 dans un entier SPARC64 popc nativement en O(log n) ralisable par
1

4 oprations sur 64 bits/cycle 256 oprations sur 1 bit/cycle ! Oprations binaire style ^, &, |, ~ sans problme Jeux dinstructions :
1 Alpha 21164 600 MHz 76,8 GIPS 1 bit, 9,6 GIPS 8 bits 1 Pentium 4 SSE3 4 GHz : 2 oprations 128 bits/cycle 1 TIPS (1012 oprations par secondes) 1 bit

uint32_t T0 ; T0 = ( T1 & 0 x55555555 ) + (( T1 >> 1) & 0 x55555555 ); T0 = ( T0 & 0 x33333333 ) + (( T0 >> 2) & 0 x33333333 ); T0 = ( T0 & 0 x0f0f0f0f ) + (( T0 >> 4) & 0 x0f0f0f0f ); T0 = ( T0 & 0 x00ff00ff ) + (( T0 >> 8) & 0 x00ff00ff ); T0 = ( T0 & 0 x0000ffff ) + (( T0 >> 16) & 0 x0000ffff );

Ide : plutt que de rsoudre 1 problme la fois, clate problme en binaire pour calculer 256 tranches de problmes binaires la fois Exemple : bibliothques de cassage de codes cryptographiques (dtection mots de passe faibles avec John the Ripper), traitement dimage, traitement du signal, codage, optimisation de programmes...

C avant C UV2 INF 446 TLCOM Bretagne/Info/HPCAS E E S. E VEN, S. G UELTON & R. K ERYELL 207 / 361

C avant C UV2 INF 446 TLCOM Bretagne/Info/HPCAS E E S. E VEN, S. G UELTON & R. K ERYELL 208 / 361

Expressions

Smantique oprateurs

Expressions

Smantique oprateurs

Application utilisant des additions 9 et 6 bits

(I)

Gaz sur rseau


Sites contenant des particules se dplaant quantiquement

(I)

Compactage dans 32 bits a_xxs_yys : quality 8 q_a 6 0 1 q_x 8 0 1 q_y 8

Interactions entre particules sur chaque site


Propagation Collision

q_a sur 6 bits, q_x et q_y sur 8 bits Oprations sur q_x et q_y sur 9 bits (vite lextraction) stockage sur 9 bits aussi
2 1 0 4 5

Garde des 0 dlimiteurs absorbant les retenues (& masque ) Besoin de tester (qx ,qy ) [128,127]2 :
Changement repre (biais +128) (qx ,qy ) [0,255]2 Test de a_xxs_yys&((1<<8)+(1<<18))==0 : 1 instruction !

Tableau de sites contenant 1 bit de prsence d1 particule allant dans 1 direction Symtrie triangulaire Compactage de 32 ou 64 sites/int par direction

C avant C UV2 INF 446 TLCOM Bretagne/Info/HPCAS E E S. E VEN, S. G UELTON & R. K ERYELL 209 / 361

C avant C UV2 INF 446 TLCOM Bretagne/Info/HPCAS E E S. E VEN, S. G UELTON & R. K ERYELL 210 / 361

Expressions

Smantique oprateurs

Expressions

Smantique oprateurs

Gaz sur rseau


1 2

(II)

Gaz sur rseau

(III)

10

12

14

16

18

20

a = l a t t i c e [ RIGHT ] ; b = l a t t i c e [ TOP_RIGHT ] ; c = l a t t i c e [ TOP_LEFT ] ; // P a r t i c u l e s q u i montentgauche d = l a t t i c e [ LEFT ] ; // P a r t i c u l e s q u i vont gauche e = l a t t i c e [ BOTTOM_LEFT ] ; f = l a t t i c e [ BOTTOM_RIGHT ] ; s = s o l i d ; //Une c on di t i on l i m i t e ns = ~s ; r = l a t t i c e [RANDOM ] ; //Unpeud al a nr = ~ r ; /A t r i p l e t ?/ t r i p l e = ( a^b ) & ( b^ c ) & ( c ^d ) & ( d^e ) & ( e^ f ) ; /Doubles?/ double_ad = ( a&d&~(b | c | e | f ) ) ; double_be = ( b&e&~(a | c | d | f ) ) ; d o u b l e _ c f = ( c& f &~(a | b | d | e ) ) ; /Theexchange of p a r t i c l e s : / change_ad = t r i p l e | double_ad | ( r &double_be ) | ( n r&d o u b l e _ c f ) ; change_be = t r i p l e | double_be | ( r &d o u b l e _ c f ) | ( n r&double_ad ) ; change_cf = t r i p l e | d o u b l e _ c f | ( r &double_ad ) | ( n r&double_be ) ;

22

24

26

28

30

32

34

36

/Where t he r e i s blowing , c o l l i s i o n s are no l on g e r v a l u a b l e : / b l = blow [ N_DIR ] ; s &= ~ b l ; ns &= ~ b l ; / E f f e c t s t he exchangewhere i t has t o do according t he s o l i d : / l a t t i c e [ RIGHT ] = ( ( ( a^ change_ad )& ns ) | ( d&s ) ) | b l &blow [ RIGHT ] ; l a t t i c e [ TOP_RIGHT] = ( ( ( b^ change_be )& ns ) | ( e&s ) ) | b l &blow [ TOP_RIGHT ] ; l a t t i c e [ TOP_LEFT ] = ( ( ( c ^ change_cf )& ns ) | ( f &s ) ) | b l &blow [ TOP_LEFT ] ; l a t t i c e [ LEFT ] = ( ( ( d^ change_ad )& ns ) | ( a&s ) ) | b l &blow [ LEFT ] ; l a t t i c e [BOTTOM_LEFT ] = ( ( ( e^ change_be )& ns ) | ( b&s ) ) | b l &blow [BOTTOM_LEFT ] ; l a t t i c e [BOTTOM_RIGHT ] = ( ( ( f ^ change_cf )& ns ) | ( c&s ) ) | b l &blow [BOTTOM_RIGHT ] ;

C avant C UV2 INF 446 TLCOM Bretagne/Info/HPCAS E E S. E VEN, S. G UELTON & R. K ERYELL 211 / 361

C avant C UV2 INF 446 TLCOM Bretagne/Info/HPCAS E E S. E VEN, S. G UELTON & R. K ERYELL 212 / 361

Expressions

Smantique oprateurs

Expressions

Smantique oprateurs

Gaz sur rseau

(IV)

Gaz sur rseau

(V)

Cylindre

C avant C UV2 INF 446 TLCOM Bretagne/Info/HPCAS E E S. E VEN, S. G UELTON & R. K ERYELL 213 / 361

C avant C UV2 INF 446

Instabilits de Von K ARMAN


Expressions

TLCOM Bretagne/Info/HPCAS E E

S. E VEN, S. G UELTON & R. K ERYELL

214 / 361

Expressions

Smantique oprateurs

Smantique oprateurs

Expressions logiques
Renvoient 1 pour vrai et 0 pour faux Oprateurs de comparaison classiques
< <= infrieur ou gal == test dgalit ne pas confondre avec oprateur daffectation... != test dingalit >= suprieur ou gal >

(I)

Expressions logiques
Optimisation : si expr1 est faux, rsultat faux indpendant dexpr2 En C, si premire expression fausse, la seconde nest pas value Important si effets de bords... Pratique : permet programmation subtile avec moins de if () Semblable oprateur && du shell ne pas confondre avec oprateur sur bits & qui value 2 oprandes Si boolens non normaliss : 1&2 vaut 0, donc Vrai&Vrai=Faux... Normalisation : !(!a||!b)

(II)

Ngation boolenne prxe : ! oprateur sur bits ~ Oprateur boolen et


1

ne pas confondre avec

Oprateur boolen ou inclusif


1

expr1 || expr2

expr1 && expr2

Travaille sur oprateurs boolens


C avant C UV2 INF 446 TLCOM Bretagne/Info/HPCAS E E S. E VEN, S. G UELTON & R. K ERYELL 215 / 361

Passage en SSE2 : 2 128 sites traits par cycles Travaille sur oprateurs boolens Utilisation possible de si expr1 est vrai, rsultat vrai indpendant dexpr2 Optimisation : cartes graphiques Autre mthode par table de collision mais problme dbit mmoire/cache (cf scatter/gather des processeurs vectoriels) C avant C UV2 INF 446
TLCOM Bretagne/Info/HPCAS E E S. E VEN, S. G UELTON & R. K ERYELL 216 / 361

Expressions

Smantique oprateurs

Expressions

Smantique oprateurs

Expressions logiques

(III)

Expression conditionnelle

(I)

En C, si premire expression vraie, la seconde nest pas value Important si effets de bords... Pratique : permet programmation subtile avec moins de if () Semblable oprateur || du shell ne pas confondre avec oprateur sur bits | qui value 2 oprandes

expressioncond ? expressionsi-vraie : expressionsi-fausse

Selon la condition renvoie rsultat dune expression ou de lautre Pratique pour mettre des tests l o on ne peut pas mettre dinstruction Exemple afchant un chiffre binaire en franais
1

Pas doprateur boolen ou exclusif


Pas doptimisation permettant de supprimer une valuation Utiliser oprateur sur bits ^ mais si son normalis... Pour normaliser utiliser !a^!b

puts ( n == 0 ? " z e r o " : "un" );

C avant C UV2 INF 446 TLCOM Bretagne/Info/HPCAS E E S. E VEN, S. G UELTON & R. K ERYELL 217 / 361

C avant C UV2 INF 446 TLCOM Bretagne/Info/HPCAS E E S. E VEN, S. G UELTON & R. K ERYELL 218 / 361

Expressions

Smantique oprateurs

Expressions

Smantique oprateurs

Oprateurs effet de bord


Affectation
a=b; Originalit du C : affectation est une expression et non une instruction : renvoie valeur affecte Si on affecte un vecteur un autre, pas de copie dlments, juste nouveau vecteur pointe vers ancien vecteur Par contre affectation de structure copie la structure (idem dans appel de fonction)

(I)

Oprateurs effet de bord


Aussi une expression

(II)

Incrmentation/dcrmentation
Existe en version Prxe : agit avant renvoi de valeur
1 2

++v incrmente v et renvoie sa valeur --v dcrmente v et renvoie sa valeur

Postxe : agit aprs renvoi de valeur


v++ renvoie la valeur de v et incrmente v v-- renvoie la valeur de v et dcrmente v

Affectation avec opration arithmtique


Syntaxe de type a op= b quivalente a = (a) op (b) sauf que a nest valu quune fois
1 2

Exemple classique de concision


1 2

// A f f i c h e une c hos e : * p o i n t e _ e t _ a f f i c h e () += 3; // A f f i c h e deux c h o s e s : * p o i n t e _ e t _ a f f i c h e () = * p o i n t e _ e t _ a f f i c h e () + 3;

char * p = " c h e r c h e l a f i n " ; w h i l e (*++ p != \0 ) ; // p p o i n t e s u r l e \ 0 f i n a l

Donc
C avant C UV2 INF 446

si effets de bords...
C avant C UV2 INF 446 S. E VEN, S. G UELTON & R. K ERYELL 219 / 361 TLCOM Bretagne/Info/HPCAS E E S. E VEN, S. G UELTON & R. K ERYELL 220 / 361

TLCOM Bretagne/Info/HPCAS E E

Expressions

Smantique oprateurs

Expressions

Coercition de type

Taille dun objet

(I)

Le plan
1

sizeof() Renvoie une taille en caractres de type size_t dnie avec


1

2 3

# i n c l u d e < stddef .h >

Penser multiplier par CHAR_BIT pour avoir la taille en bits... Autre macro intressante offsetof(une_structure, un_champ) qui renvoie le dplacement du champ par rapport au dbut de la structure

Introduction Bibliographie Petite histoire Langage Gnralits Un ordinateur ? Mais quest-ce ? Les bases de la numrologie Calcul binaire Dclarations Gnralits Types des objets Porte Expressions Smantique oprateurs Coercition de type Instructions Prprocesseur Bibliothques

9 10 11 12

13

14

6 7 8
C avant C UV2 INF 446 TLCOM Bretagne/Info/HPCAS E E S. E VEN, S. G UELTON & R. K ERYELL 221 / 361

15 16 17

Modle mmoire & allocation Entres-sorties GNOME diteur exemple dEmacs Tuning de son clavier Compilation Modularisation Mise au point Dvermineur (debugger) Analyse mmoire Extensions Du C pour le graphisme C++ Dlires Le btisier Concours de programmes incomprhensibles Conclusion Index Table des matires

C avant C UV2 INF 446 TLCOM Bretagne/Info/HPCAS E E S. E VEN, S. G UELTON & R. K ERYELL 222 / 361

Expressions

Coercition de type

Expressions

Coercition de type

Coercition : conversion explicite de type

(I)

Coercition : conversion explicite de type

(II)

utiliser lorsquon nest pas persuad du bon type

Denition
La coercition est lusage dlibr et sens de menaces exprimes ouvertement pour inuencer les choix stratgiques. Cette dnition large permet dinclure les diffrentes faons de mettre en pratique la coercition tout en conservant lide principale dinuence cest--dire dagir en sorte que lentit dont on veut inuencer le comportement va renoncer ses choix initiaux et adopter les solutions prconises par lagent qui met en pratique cette coercition. Julien D UVAL,
http://www.departmentofintelligence.com/fr/science_politique/scpo9.htm

La coercition prend ses racines suite lchec de la persuasion. La persuasion demande comme lindique Massimo Piattelli Palmarini danticiper sur les motivations et les schmas mentaux de nos interlocuteurs pour mieux en triompher . Persuader poursuit il, cest provoquer un changement de la volont dautrui, mais attention, seulement travers un transfert de croyances ou dopinions . La coercition ne joue pas sur ce ressort mais sur celui de la contrainte. Lobjectif est damener quelquun faire quelque chose et peu importe les moyens utiliss.

C avant C UV2 INF 446 TLCOM Bretagne/Info/HPCAS E E S. E VEN, S. G UELTON & R. K ERYELL 223 / 361

C avant C UV2 INF 446 TLCOM Bretagne/Info/HPCAS E E S. E VEN, S. G UELTON & R. K ERYELL 224 / 361

Expressions

Coercition de type

Expressions

Coercition de type

cast en anglais

(I)

Transtypage explicite ou cast

(I)

(type) expression

Intrt multiple

Denition
Alors Brice, aujourdhui on va voir la programmation, tu pars bien haut, bien abstrait dun void et tu descend sur un entier sign. Et tu cast, et tu cast et tu cast. Parodie par Jrme H ERMAN quivalent de la coercition ou le transtypage en franais

Promotions
1

double a ; i n t m , n ; a = ( double ) m / ( double ) n ;

Permet troncatures simplement


1

i n t i , c ; double a , b ; a=( i n t )b; c = ( char ) i ;

Toutes sortes de puissantes sordicits

C avant C UV2 INF 446 TLCOM Bretagne/Info/HPCAS E E S. E VEN, S. G UELTON & R. K ERYELL 225 / 361

C avant C UV2 INF 446 TLCOM Bretagne/Info/HPCAS E E S. E VEN, S. G UELTON & R. K ERYELL 226 / 361

Expressions

Coercition de type

Expressions

Coercition de type

Transtypage explicite ou cast


1 2

(II)

Pointeurs & manipulation dadresses


& (prxe) permet de rcuprer adresse (rfrence) dun objet * (prxe) permet de drfrencer un pointeur (accder objet donnes pointes) Ne peut pas avoir ladresse dun champ de bits car adresse mmoire en C toujours en octet, pas adresse de bit
1

(I)

10

int64_t n ; int16_t f ; double d ; n = * ( int64_t *) & d ; // n c o n t i e n t l a r e p r s e n t a t i o n b i n a i r e de d f = (( int16_t *) & d )[2]; // f c o n t i e n t l e s b i t s 3247 de d (( char *) & d )[7] += 1; / b r i c o l e d en l u i r a j o u t a n t 1 son d e r n i e r o c t e t de m an t i s s e . /

Pour faire du passage darguments par rfrence dans fonction, utiliser des rfrences
v o id foo ( double * a , i n t * b ) { ... * a = 3.4; * b = 42; // La r pon s e ! ... } double bar ; i n t daurade ; ... foo (& bar , & daurade );
TLCOM Bretagne/Info/HPCAS E E S. E VEN, S. G UELTON & R. K ERYELL 228 / 361

Extrmement pratique en lectronique, systme embarqu, manipulation de codage... videmment pas portable mais toujours mieux que de lcrire en assembleur contrler avec pr-processeur... tous les ordinateurs ne rangent pas octets, voire bits des entiers dans le mme sens...

10

C avant C UV2 INF 446 TLCOM Bretagne/Info/HPCAS E E S. E VEN, S. G UELTON & R. K ERYELL 227 / 361

C avant C UV2 INF 446

Expressions

Coercition de type

Expressions

Coercition de type

Pointeurs & manipulation dadresses


. . . 2a 00 00 00 . . . 33 33 33 33 33 33 0b 40 . . . 48 9b 04 08 40 9b 04 08 . . .

(II)

Arithmtique sur pointeurs


Smantique spciale darithmtique sur pointeurs Suppose quun pointeur pointe vers un (hypothtique) vecteur dobjet ressemble Si p pointe vers un lment
p-1 ou &p[-1] pointe vers lment prcdent p+1 ou &p[1] pointe vers lment suivant

(I)

08049b40 08049b41 08049b42 08049b43

daurade (0000002a)

08049b48 08049b49 08049b4a 08049b4b 08049b4c 08049b4d 08049b4e 08049b4f

bar (400b333333333333)

On peut utiliser oprateurs de comparaisons sur pointeurs pour savoir si objets pointeurs sont avant ou aprs dans un vecteur
a (08049b48)

ffb75170 ffb75171 ffb75172 ffb75173 ffb75174 ffb75175 ffb75176 ffb75177

Si p et q sont pointeurs sur objets de mme type, q-p est la distance en nombre dobjets entre p et q Ne pas confondre arithmtique sur pointeurs avec arithmtique sur adresse
Comme en C la mmoire est accde par caractre, quivalence dans le cas de pointeurs sur des caractres
C avant C UV2 INF 446

b (08049b40)

C avant C UV2 INF 446 TLCOM Bretagne/Info/HPCAS E E S. E VEN, S. G UELTON & R. K ERYELL 229 / 361

TLCOM Bretagne/Info/HPCAS E E

S. E VEN, S. G UELTON & R. K ERYELL

230 / 361

Expressions

Coercition de type

Expressions

Coercition de type

Arithmtique sur pointeurs

(II)

Liste dexpressions

(I)

Concrtement si
1 2

expression1 ,expression2

obj * p ; i n t d;

valuation des 2 expressions Renvoie seulement valeur dernire expression


p+d (obj*)(d*sizeof(obj)+(char*)p)

alors

Certains processeurs ont des contraintes dalignement sur objets vers une certaine taille pour simplier et acclrer accs. Par exemple si accs un double adresse non multiple de 8 : bus error sur SPARC

Permet de mettre plusieurs expressions l o il ny a place que pour une et o instruction interdite Exemple
1

f o r ( i = 0 , j = 1 , k = n ; i < m ; i ++ , j += 3 , k -= n ) ...

C avant C UV2 INF 446 TLCOM Bretagne/Info/HPCAS E E S. E VEN, S. G UELTON & R. K ERYELL 231 / 361

C avant C UV2 INF 446 TLCOM Bretagne/Info/HPCAS E E S. E VEN, S. G UELTON & R. K ERYELL 232 / 361

Instructions

Instructions

Le plan
1

Instructions
Modle mmoire & allocation Entres-sorties GNOME diteur exemple dEmacs Tuning de son clavier Compilation Modularisation Mise au point Dvermineur (debugger) Analyse mmoire Extensions Du C pour le graphisme C++ Dlires Le btisier Concours de programmes incomprhensibles Conclusion Index Table des matires

(I)

2 3

Introduction Bibliographie Petite histoire Langage Gnralits Un ordinateur ? Mais quest-ce ? Les bases de la numrologie Calcul binaire Dclarations Gnralits Types des objets Porte Expressions Smantique oprateurs Coercition de type Instructions Prprocesseur Bibliothques

9 10 11 12

Brique constituante dun programme Sans type ni valeur 3 sortes dinstructions


Instructions lmentaires Instructions composes avec structures de contrles Instructions de saut

13

Trs simples compares aux expressions...

14

6 7 8

15 16 17

C avant C UV2 INF 446 TLCOM Bretagne/Info/HPCAS E E S. E VEN, S. G UELTON & R. K ERYELL 233 / 361

C avant C UV2 INF 446 TLCOM Bretagne/Info/HPCAS E E S. E VEN, S. G UELTON & R. K ERYELL 234 / 361

Instructions

Instructions

Instructions lmentaires

(I)

Instructions lmentaires

(II)

Expression suivie par un ;


1 2

q = 3; inutile ; // Encore p l u s i n u t i l e i c i : ; f o r (;;) // Mais pas l : ; / Onne s en s o r t i r a j am ai s de c e t t e b o u c l e i n f i n i e . . . /

1 2

v o l a t i l e i n t entree ; / Les l a b e l s s o n t b i e n p r a t i q u e s pour s i m p l i f i e r l a g e s t i o n de s e r r e u r s : / gere_entre e : lire (); // Mchante a t t e n t e a c t i v e : f o r (;;) i f ( entree == 3) goto gere_entre e ;

On peut regrouper des instructions dans des blocs entre { et } On peut rajouter des tiquettes (labels) devant des instructions pour rfrence ultrieure (saut)

C avant C UV2 INF 446 TLCOM Bretagne/Info/HPCAS E E S. E VEN, S. G UELTON & R. K ERYELL 235 / 361

C avant C UV2 INF 446 TLCOM Bretagne/Info/HPCAS E E S. E VEN, S. G UELTON & R. K ERYELL 236 / 361

Instructions

Instructions

Tests if

(I)

Tests if

(II)

1 2 3

Dans expressions de test en gnral ne pas confondre


Si v vaut w alors...
1

i f (expression) instruction-si-vrai else instruction-si-faux

i f ( v == w )

Branche else optionnelle Considre comme vraie expression de valeur non nulle

Met w dans v et si v est non nul alors...


1

i f (v=w)

C avant C UV2 INF 446 TLCOM Bretagne/Info/HPCAS E E S. E VEN, S. G UELTON & R. K ERYELL 237 / 361

C avant C UV2 INF 446 TLCOM Bretagne/Info/HPCAS E E S. E VEN, S. G UELTON & R. K ERYELL 238 / 361

Instructions

Instructions

Aiguillage switch
Compare expression par rapport plusieurs valeurs constantes entires
1

(I)

Boucle while

(I)

s w it c h ( caractere ) { case : majuscule = ; voyelle ++; break ; // S o r t du s w i t c h case : blanc ++; d e f a u l t : n o n _ a l p h a b e t i q u e ++; }

1 2

w h i l e ( abs ( e ) >= epsilon ) e = f ( v );

Condition value avant excution corps de boucle Boucle si vrai (si expression de valeur non nulle) De manire gnrale dans boucles en C, break; permet de sortir de la boucle courante (pour autres cas, utiliser par exemple goto) De manire gnrale dans boucles en C, continue; permet de passer itration suivante de la boucle courante

11

Partie default est optionnelle


C avant C UV2 INF 446 TLCOM Bretagne/Info/HPCAS E E S. E VEN, S. G UELTON & R. K ERYELL 239 / 361

Si pas de break dans un case, on excute aussi la suite...


C avant C UV2 INF 446 TLCOM Bretagne/Info/HPCAS E E S. E VEN, S. G UELTON & R. K ERYELL 240 / 361

Instructions

Instructions

Boucle do

(I)

Boucle for
Sucre syntaxique autour de boucle while
1 2

(I)

f o r (expr-init;expr-test;expr-fin-corps) instruction-corps

1 2

do i ++; w h i l e ( i < f );

Sur entre de boucle, value expr-init. En C99, cette expression peut en fait contenir une initialisation de variable visibilit sur boucle Itre tant que expr-test est vraie (valeur non nulle). value avant toute itration expr-fin-corps value en n de chaque itration, aprs corps de boucle
1 2

Condition value aprs excution corps de boucle Corps de boucle excut au moins une fois

f o r ( i n t i = 0; i < taille ; i ++) printf ( " V a l e u r de %d=%f \n" ,i , v [ i ]);

C avant C UV2 INF 446 TLCOM Bretagne/Info/HPCAS E E S. E VEN, S. G UELTON & R. K ERYELL 241 / 361

C avant C UV2 INF 446 TLCOM Bretagne/Info/HPCAS E E S. E VEN, S. G UELTON & R. K ERYELL 242 / 361

Instructions

Instructions

Instructions de saut
Lorsque la vie ne doit plus tre un long euve tranquille... chappement
continue; passe itration suivante dans une boucle break; arrte boucle ou switch() courants Retour de fonction ou procdure
1

(I)

Instructions de saut

(II)

r e t u r n expression;

arrte fonction en cours et renvoie valeur de lexpression qui doit avoir type compatible avec dclaration de fonction Cas particulier : une procdure na pas besoin dappeler return; mais peut aussi lutiliser sans expression

f o r (...) f o r (...) { ... i f ( e r r e u r _ c o m m i s e ) goto erreur ; } erreur : fprintf ( stderr , " E r r e u r r e n c o n t r e : " " v a l e u r %f i n c o r r e c t e \n" , valeur ); exit ( -1);

Branchement
1

Base des programmes spaghetti ! Abus dangereux pour la sant (mentale)

goto label;

permet de continuer excution lendroit du label


C avant C UV2 INF 446 TLCOM Bretagne/Info/HPCAS E E S. E VEN, S. G UELTON & R. K ERYELL 243 / 361 C avant C UV2 INF 446 TLCOM Bretagne/Info/HPCAS E E S. E VEN, S. G UELTON & R. K ERYELL 244 / 361

Prprocesseur

Prprocesseur

Le plan
1

Prprocesseur
Modle mmoire & allocation Entres-sorties GNOME diteur exemple dEmacs Tuning de son clavier Compilation Modularisation Mise au point Dvermineur (debugger) Analyse mmoire Extensions Du C pour le graphisme C++ Dlires Le btisier Concours de programmes incomprhensibles Conclusion Index Table des matires

(I)

2 3

Introduction Bibliographie Petite histoire Langage Gnralits Un ordinateur ? Mais quest-ce ? Les bases de la numrologie Calcul binaire Dclarations Gnralits Types des objets Porte Expressions Smantique oprateurs Coercition de type Instructions Prprocesseur Bibliothques

9 10 11 12

Besoins Avoir du code portable Factoriser du code redondant grain plus petit que fonction Compilation conditionnelle Transformations de programmes Utiliser un prprocesseur entre programme source et compilateur lui-mme

13

14

6 7 8

15 16 17

C avant C UV2 INF 446 TLCOM Bretagne/Info/HPCAS E E S. E VEN, S. G UELTON & R. K ERYELL 245 / 361

C avant C UV2 INF 446 TLCOM Bretagne/Info/HPCAS E E S. E VEN, S. G UELTON & R. K ERYELL 246 / 361

Prprocesseur

Prprocesseur

Prprocesseur C (CPP)

(I)

Inclusion de chiers

(I)

Syntaxe oriente ligne (contrairement au C lui-mme) Ligne commence par # Possible de mettre une instruction sur plusieurs lignes avec \
1 2 1

# define HISTO_ADRESS(a,x,y)\ ((( a ) << ( L O G 2 _ X A X I S _ H I S T O _ D E F \ + L O G 2 _ Y A X I S _ H I S T O _ D E F )) \ + (( x ) << L O G 2 _ Y A X I S _ H I S T O _ D E F ) \ + ( y ))

/ I n c l u s i c i un f i c h i e r d e n t t e s t a n d a r d / # i n c l u d e < stdio .h > // Et i c i un f i c h i e r p l u s p e r s o n n e l au p r o j e t : # i n c l u d e " c o r r e l e . h" // On p e u t i n c l u r e un f i c h i e r d f i n i dans une macro # d e f i n e portabili t e " b l u egene . h" # i n c l u d e portabilit e

Rcursion possible : un chier peut aussi inclure dautres chiers Pour mise au point, possibilit davoir source dans prprocesseur seulement avec gcc -E Fonction dEmacs pour afcher rgion pass dans prprocesseur aux rcursions avec inclusions innies

C avant C UV2 INF 446 TLCOM Bretagne/Info/HPCAS E E S. E VEN, S. G UELTON & R. K ERYELL 247 / 361

C avant C UV2 INF 446 TLCOM Bretagne/Info/HPCAS E E S. E VEN, S. G UELTON & R. K ERYELL 248 / 361

Prprocesseur

Prprocesseur

Macroconstantes et macrofonctions
Dnitions et usages
Macroconstantes
1

(I)

Macroconstantes et macrofonctions
Effacement
1

(II)

# undef PLURAL

# d e f i n e E Q U I V _ H I S T O _ T Y P E unsigned s h o r t i n t t y p e d e f E Q U I V _ H I S T O _ T Y P E histo ;

Souvent identiants en majuscule pour indiquer macro Possibilits de dnir et annuler des macro la compilation
1

Macrofonctions
1 2

10

# define HISTO_ADRESS(a,x,y)\ ((( a ) << ( L O G 2 _ X A X I S _ H I S T O _ D E F \ + L O G 2 _ Y A X I S _ H I S T O _ D E F )) \ + (( x ) << L O G 2 _ Y A X I S _ H I S T O _ D E F ) \ + ( y )) # i f d e f RUN_LT_TP # d e f i n e q u a l i t y _ i n c r e m e n t ( v ) v += quality # else # d e f i n e q u a l i t y _ i n c r e m e n t ( v ) v += 1 # endif q u a l i t y _ i n c r e m e n t ( rc_c );

gcc -D NDEBUG -D BITSIZE =64 -D X2 ( a )=( a )*( a ) -U RIEN ...

Macrofonction = fonction
# d e f i n e CARRE ( x ) x * x # d e f i n e M E I L L E U R _ C A R R E ( x ) ( x )*( x ) inline double SUPER_CAR R E ( double x ) { r e t u r n x * x ; }

CARRE(a+++1) est remplac par a+++1*a+++1 MEILLEUR_CARRE(a+++1) est remplac par (a+++1)*(a+++1) SUPER_CARRE(a+++1) donne le bon rsultat

C avant C UV2 INF 446 TLCOM Bretagne/Info/HPCAS E E S. E VEN, S. G UELTON & R. K ERYELL 249 / 361

C avant C UV2 INF 446 TLCOM Bretagne/Info/HPCAS E E S. E VEN, S. G UELTON & R. K ERYELL 250 / 361

Prprocesseur

Prprocesseur

Macroconstantes et macrofonctions
Gnrateur de constantes chanes de caractres avec #
1

(III)

Macroconstantes et macrofonctions

(IV)

# d e f i n e CHAINE ( x ) # x

est transform en "toto" Plus subtil si on veut la valeur dune macro :


CHAINE(toto)
1 2

/ To g e n e r a t e a s t r i n g fromamacro : / # d e f i n e S T R I N G I F Y _ S E C O N D _ S T A G E ( symbol ) # symbol / I f n ot u s i n g t h i s 2 s t a g e macro e v a l u a t i o n , t h e g e n e r a t e d s t r i n g i s n ot t h e v a l u e o f t h e macro b u t t h e name o f t h e macro . . . Who s a i d Cwasa s i m p l e l a n g u a g e ?:/ / # d e f i n e STRINGIFY ( symbol ) S T R I N G I F Y _ S E C O N D _ S T A G E ( symbol )

Possible davoir des macros avec nombre variables darguments (__VA_ARGS__...) Nombreuses constantes prdnies pour messages de dbogage sympatiques ou tests de version
__FILE__ nom du chier courant __TIME__ heure de compilation __STDC_VERSION__ version du C ...

Concatnation avec ##
1 2

Permet de faire des messages de type

# d e f i n e DEFTYPE (x , y ) t y p e d e f x y x ## y DEFTYPE ( long , i n t ); longint i ;

C avant C UV2 INF 446 TLCOM Bretagne/Info/HPCAS E E S. E VEN, S. G UELTON & R. K ERYELL 251 / 361

C avant C UV2 INF 446 TLCOM Bretagne/Info/HPCAS E E S. E VEN, S. G UELTON & R. K ERYELL 252 / 361

Prprocesseur

Prprocesseur

Macroconstantes et macrofonctions

(V)

Compilation conditionnelle

(I)

11

# i f n d e f NDEBUG # d e f i n e _assert ( ex ) { i f (!( ex )){\ ( v o id ) fprintf ( stderr ,\ " A s s e r t i o n f a i l e d : f i l e \"% s \ " , l i n e %d\n" ,\ __FILE__ , __LINE__ );\ abort ();}} # d e f i n e assert ( ex ) _assert ( ex ) # else # d e f i n e _assert ( ex ) # d e f i n e assert ( ex ) # en d if

Possibilit de sauter des lignes en fonction de conditions Instructions


#if condition boolenne #ifdef si une macro est dnie #ifndef si une macro nest pas dnie #else #endif #elif condition boolenne

cpp -dM montre dnition de toutes macros dans un programme Pseudo-variable (pas macro !) __func__ nom fonction courante (nouveau en C99)

Pour crire condition, nombreux oprateurs du C disponibles plus oprateur define pour tester la dnition dune macro

C avant C UV2 INF 446 TLCOM Bretagne/Info/HPCAS E E S. E VEN, S. G UELTON & R. K ERYELL 253 / 361

C avant C UV2 INF 446 TLCOM Bretagne/Info/HPCAS E E S. E VEN, S. G UELTON & R. K ERYELL 254 / 361

Prprocesseur

Bibliothques

Compilation conditionnelle
1

(II)

Le plan
1

11

# i f defined D E B U G _ F C P S O F T || defined V E R I F Y _ M A T C H PLURAL i n t schpkno = 0; PLURAL i n t a , u , v ; # endif # i f N U M B E R _ O F _ H I S T O G R A M S != 1 / S h i f t e d v e r s i o n : / c o m p u t e _ h i s t o g r a m _ a d r e s s ( h_p , s h i f t e d _ h i s t o g r a m _ a d d r e s s , s h i f t e d _ a _ x x s _ y y s ); # else h_p = NULL ; # endif

2 3

Trs pratique pour viter inclusions sans n de chiers. Exemple de /usr/include/stdio.h :


1 2

# i f n d e f _STDIO_H # d e f i n e _STDIO_H 1 ... # e n d i f / !_STDIO_H/

Introduction Bibliographie Petite histoire Langage Gnralits Un ordinateur ? Mais quest-ce ? Les bases de la numrologie Calcul binaire Dclarations Gnralits Types des objets Porte Expressions Smantique oprateurs Coercition de type Instructions Prprocesseur Bibliothques

9 10 11 12

13

14

6 7 8

15 16 17

Modle mmoire & allocation Entres-sorties GNOME diteur exemple dEmacs Tuning de son clavier Compilation Modularisation Mise au point Dvermineur (debugger) Analyse mmoire Extensions Du C pour le graphisme C++ Dlires Le btisier Concours de programmes incomprhensibles Conclusion Index Table des matires

C avant C UV2 INF 446 TLCOM Bretagne/Info/HPCAS E E S. E VEN, S. G UELTON & R. K ERYELL 255 / 361

C avant C UV2 INF 446 TLCOM Bretagne/Info/HPCAS E E S. E VEN, S. G UELTON & R. K ERYELL 256 / 361

Bibliothques

Bibliothques

Bibliothques
Peu de choses dans langage C autre que minimum Tout le superu pass en bibliothques standard
Entres-sorties Traitement chanes de caractres normaux & larges Fonctions mathmatiques Gestion fonctions nombre variable darguments ...

(I)

Bibliothque standard
Beaucoup de fonctions, types, variables, macros... 24 enttes .h dclarants diverses fonctions, variables et structures de donnes Possible dinclure ces chiers dans nimporte quel ordre et autant de fois quon veut Implmentation libre : la GNU libc info libc qui inclut ISO C, POSIX.2 et quelques extensions Multistandard selon macros quon dnit

C avant C UV2 INF 446

(I)

Nombreuses autres bibliothques disponibles, souvent aussi disponibles dans dautres langages : factorisation apprentissage
POSIX : interaction avec systme dexploitation Interfaces utilisateurs
GNOME KDE http://developer.kde.org avec Qt

Bibliothques scientiques Bibliothques mtiers ...


C avant C UV2 INF 446 TLCOM Bretagne/Info/HPCAS E E S. E VEN, S. G UELTON & R. K ERYELL 257 / 361

_POSIX_SOURCE _POSIX_C_SOURCE _BSD_SOURCE _LARGEFILE64_SOURCE _FILE_OFFSET_BITS _ISOC99_SOURCE _GNU_SOURCE : la totale !

TLCOM Bretagne/Info/HPCAS E E

S. E VEN, S. G UELTON & R. K ERYELL

258 / 361

Bibliothques

Bibliothques

Bibliothque standard

(II)

Contenu bibliothque standard glibc


Gestion des erreurs Dtails du langage tels que

(I)

_THREAD_SAFE

Beaucoup trop de choses pour tout retenir... ...mais savoir catgories qui existent et savoir trouver information info libc et man viter de rednir des fonctions standard, sauf pour obscurcir un programme

NULL Nombre darguments variables dans fonctions Bornes des types arithmtiques Assertions et dbogage

Gestion de la mmoire, allocation mmoire virtuelle Gestion des caractres, classication et conversion Manipulation de chanes de caractres et tableaux Entres-sorties et chiers sur des streams (FILE *) avec tampons intermdiaires pour limiter appels systmes Entres-sorties bas niveau : appels systmes qui oprent sur descripteurs de chiers Manipulation de systmes de chiers

C avant C UV2 INF 446 TLCOM Bretagne/Info/HPCAS E E S. E VEN, S. G UELTON & R. K ERYELL 259 / 361

C avant C UV2 INF 446 TLCOM Bretagne/Info/HPCAS E E S. E VEN, S. G UELTON & R. K ERYELL 260 / 361

Bibliothques

Bibliothques

Contenu bibliothque standard glibc


Tuyaux (pipes) et les dattentes (FIFOs) de communication inter-processus Sockets (tuyaux de communication inter-machines) Gestion des terminaux dinteraction (cran, clavier, fentre) Fonctions mathmatiques Fonctions arithmtiques de bas niveau (lire/crire nombres) Recherches dlments et tris de tableaux Recherches avec expressions rgulires sur chanes Temps et dates Manipulation de jeux de caractres Adaptation des programmes aux diffrents pays et langues Sauts non-locaux pour aller plus loin quun simple goto (exceptions...) Gestion des signaux
C avant C UV2 INF 446 TLCOM Bretagne/Info/HPCAS E E S. E VEN, S. G UELTON & R. K ERYELL

(II)

Contenu bibliothque standard glibc

(III)

Gestion des arguments des programmes (dnition, outils danalyse...) Cration de processus Contrle de processus, de groupes de processus Systmes de nommages (NSS) : o sont dnis urtilisateurs... Gestion utilisateurs et groupes Gestion conguration systmes (paramtres matriels)

C avant C UV2 INF 446 261 / 361 TLCOM Bretagne/Info/HPCAS E E S. E VEN, S. G UELTON & R. K ERYELL 262 / 361

Bibliothques

Modle mmoire & allocation

Bibliothques

Modle mmoire & allocation

Le plan
1

Modle mmoire du C
Modle mmoire & allocation Entres-sorties GNOME diteur exemple dEmacs Tuning de son clavier Compilation Modularisation Mise au point Dvermineur (debugger) Analyse mmoire Extensions Du C pour le graphisme C++ Dlires Le btisier Concours de programmes incomprhensibles Conclusion Index Table des matires

(I)

2 3

Introduction Bibliographie Petite histoire Langage Gnralits Un ordinateur ? Mais quest-ce ? Les bases de la numrologie Calcul binaire Dclarations Gnralits Types des objets Porte Expressions Smantique oprateurs Coercition de type Instructions Prprocesseur Bibliothques

Variables globales
Non initialises : ne prennent pas de place dans chier programme excutable mais initialises 0 au dmarrage Initialises : prennent place dans chier programme excutable

9 10 11 12

Variables automatiques : locales aux fonctions allouer dans la pile (pour grer rcursion et pouvoir empiler appels) Variables statiques dans fonction : comme variable globale (initialisation et valeur qui subsiste dun appel de fonction lautre) Comment crer des objets dynamiques la demande et qui ont une dure de vie autre que syntaxique ?
Zone dallocation dynamique spare : tas Utilise puissance des pointeurs du C pour grer cette zone De manire gnrale on peut avoir autant despaces de stockage quon veut (cf mmap())
C avant C UV2 INF 446

13

14

6 7 8

15 16 17

C avant C UV2 INF 446 TLCOM Bretagne/Info/HPCAS E E S. E VEN, S. G UELTON & R. K ERYELL 263 / 361

TLCOM Bretagne/Info/HPCAS E E

S. E VEN, S. G UELTON & R. K ERYELL

264 / 361

Bibliothques

Modle mmoire & allocation

Bibliothques

Modle mmoire & allocation

Allocation dynamique
Fonctions disponibles en mettant dans son programme
1

(I)

Allocation dynamique

(II)

# i n c l u d e < stdlib .h >


1

Allocation mmoire
1

v o id free ( v o id * ptr ); free ( v );

v o id * malloc ( size_t size ); s t r u c t s * p = malloc ( s i z e o f ( s t r u c t s ));

Suppose que zone alloue par un malloc ou consort dans le pass Changement de taille
1

Mmoire non initialise Si plus de mmoire, renvoie NULL

v o id * realloc ( v o id * old_ptr , size_t new_size );

Allocation mmoire de taille multiple


1 2

v o id * calloc ( size_t nmemb , size_t size ); // p p o i n t e v e r s v e c t e u r de t a i l l e 10 de s : s t r u c t s v [] = calloc (10 , s i z e o f ( s t r u c t s ));

Utilisation de vrications plus pousses si variable denvironnement MALLOC_CHECK_... existe man malloc et surtout info libc

Mmoire initialise 0 aussi Libration de la mmoire (remise dans pot commun)


C avant C UV2 INF 446 TLCOM Bretagne/Info/HPCAS E E S. E VEN, S. G UELTON & R. K ERYELL 265 / 361 C avant C UV2 INF 446 TLCOM Bretagne/Info/HPCAS E E S. E VEN, S. G UELTON & R. K ERYELL 266 / 361

Bibliothques

Modle mmoire & allocation

Bibliothques

Modle mmoire & allocation

Chanes de caractres
Existent en version caractres longs en remplaant dans nom str par wcs Mesure la longueur dune chane
1

(I)

Chanes de caractres

(II)

1 2

char * strcpy ( char * restrict TO , const char * restrict FROM )

size_t strlen ( const char * chane )

place disponible endroit de destination... Source principale de piratage/bug


char * strncpy ( char * restrict TO , const char * restrict FROM , size_t SIZE )

La longueur nest pas stocke dans les chanes en C... Mesure chercher le premier caractre nul ( \0) Trs coteux ! Copie de mmoire
1 2

Copie limite de chane de caractre


1 2

v o id * memcpy ( v o id * restrict TO , const v o id * restrict FROM , size_t SIZE )

Utile pour limiter copie taille de destination. place pour \0 nal... Nombreuses autres fonctions

Ne pas oublier

Copie de chane
C avant C UV2 INF 446 TLCOM Bretagne/Info/HPCAS E E S. E VEN, S. G UELTON & R. K ERYELL 267 / 361 C avant C UV2 INF 446 TLCOM Bretagne/Info/HPCAS E E S. E VEN, S. G UELTON & R. K ERYELL 268 / 361

Bibliothques

Modle mmoire & allocation

Bibliothques

Modle mmoire & allocation

strdup : LA fonction la plus utile du C

(I)

strdup : LA fonction la plus utile du C


. . . 69 63 69 00 . . . 69 63 69 00 . . . 08 70 ad 09 19 8a 04 08 . . .

(II)

Souvent besoin de dupliquer une chane (original allou automatiquement sur pile ou non modiable...) Demande mesure longueur, allouer avec malloc() sans oublier \0 nal puis recopier strdup() fait tout a dun coup !
1 2

08048a19 08048a1a 08048a1b 08048a1c

original[0] original[1] original[2] original[3]

09ad7008 09ad7009 09ad700a 09ad700b

copie[0] copie[1] copie[2] copie[3]

char * original = " i c i " ; char * copie = strdup ( original );

ffe59428 ffe59429 ffe5942a ffe5942b ffe5942c ffe5942d ffe5942e ffe5942f

copie (09ad7008)

original (08048a19)

C avant C UV2 INF 446 TLCOM Bretagne/Info/HPCAS E E S. E VEN, S. G UELTON & R. K ERYELL 269 / 361

C avant C UV2 INF 446 TLCOM Bretagne/Info/HPCAS E E S. E VEN, S. G UELTON & R. K ERYELL 270 / 361

Bibliothques

Entres-sorties

Bibliothques

Entres-sorties

Le plan
1

Entres-sorties sur stream


Modle mmoire & allocation Entres-sorties GNOME diteur exemple dEmacs Tuning de son clavier Compilation Modularisation Mise au point Dvermineur (debugger) Analyse mmoire Extensions Du C pour le graphisme C++ Dlires Le btisier Concours de programmes incomprhensibles Conclusion Index Table des matires

(I)

2 3

Introduction Bibliographie Petite histoire Langage Gnralits Un ordinateur ? Mais quest-ce ? Les bases de la numrologie Calcul binaire Dclarations Gnralits Types des objets Porte Expressions Smantique oprateurs Coercition de type Instructions Prprocesseur Bibliothques

Fonctions de haut niveau


Accs tamponns pour viter de faire trop dappels systmes coteux Possible de faire un fflush() explicite pour forcer criture sur la sortie Notion de ux dE/S (streams)
stdin : entre standard (clavier, chier...) stdout : sortie standard (console, fentre, chier...) stderr : messages derreur, non tamponne

9 10 11 12

13

Possibilit de d-lire des caractres

Cration (ouverture) de ux
1

14

FILE * mon_fichi er = fopen ( " f i c h i e r " , " r " );

6 7 8

15 16 17

Fermeture
1

fclose ( mon_fichi er );

C avant C UV2 INF 446 TLCOM Bretagne/Info/HPCAS E E S. E VEN, S. G UELTON & R. K ERYELL 271 / 361

C avant C UV2 INF 446 TLCOM Bretagne/Info/HPCAS E E S. E VEN, S. G UELTON & R. K ERYELL 272 / 361

Bibliothques

Entres-sorties

Bibliothques

Entres-sorties

Entres-sorties sur stream


Sortie dun caractre sur stdout
1

(II)

Afchage format avec printf


Dclare avec #include<stdio.h> Permet dafcher dans un certain format
1

(I)

i n t putchar ( i n t C )

Sortie dune chane de caractres sur stdout suivie dun saut de ligne
1

i n t printf ( const char * format , ...);

i n t puts ( char * chane )

Lecture caractre sur stdin


1

Nombre variable darguments, utiliss selon format Renvoie nombre de caractres crits Afche le format en traitant des balises %
1

i n t getchar ( v o id )

printf ( " Le c a r a c t r e %c a pour code o c t a l %o , " " d c i m a l %d e t h e x a d c i m a l %x \n" ,c , c , c , c );

Lecture ligne caractre sur un ux


1

Quelques balises

C avant C UV2 INF 446

char * fgets ( char *S , i n t COUNT , FILE * STREAM )

COUNT vite attaques par dbordement... Lire la documentation...


C avant C UV2 INF 446 TLCOM Bretagne/Info/HPCAS E E S. E VEN, S. G UELTON & R. K ERYELL 273 / 361

%d afche en dcimal %o afche en octal %x afche en hexadcimal minuscule %f afche un nombre ottant %e afche un nombre ottant en notation scientique
S. E VEN, S. G UELTON & R. K ERYELL 274 / 361

TLCOM Bretagne/Info/HPCAS E E

Bibliothques

Entres-sorties

Bibliothques

Entres-sorties

Afchage format avec printf


%c afche un caractre %s afche une chane de caractre %% afche un %

(II)

Afchage format avec printf

(III)

Largeur du champ prcise par un nombre aprs % Prcision avec nombre aprs . %10.4f afche potentiellement 10 chiffres avec 4 chiffres aprs la virgule Modicateur de taille tel que
%lld pour un longlongint %ls pour une chane en UNICODE

Si pirate peut fournir chaine, il peut mettre des % dedans... Trou de scurit classique Nombreuses autres versions vers dautres chiers (fprintf()) ou vers chanes de caractres (sprintf())
Extension GNU
int asprintf(char**PTR,constchar*TEMPLATE,...) Formate la sortie dans PTR aprs lavoir allou la bonne taille. Simplie bien les choses et supprime des dbordements de tampon

Nombreuses options, trs puissant lorsquon matrise Toujours utiliser un format avec printf() et consort. Ne pas utiliser la place de puts() ou autre car risque de bug ou de piratage
printf ( chaine );

Possible dtendre les formats ! man printf et surtout info libc

C avant C UV2 INF 446 TLCOM Bretagne/Info/HPCAS E E S. E VEN, S. G UELTON & R. K ERYELL 275 / 361

C avant C UV2 INF 446 TLCOM Bretagne/Info/HPCAS E E S. E VEN, S. G UELTON & R. K ERYELL 276 / 361

Bibliothques

Entres-sorties

Bibliothques

Entres-sorties

Lecture formate avec scanf


Formats de type printf mais pour ecrire dans arguments
1 2

(I)

goto non locaux


Un fonction enregistre ltat du programme dans une structure de donne Une autre permet de restaurer cet tat non local joue le rle dun goto

(I)

Comme scanf() doit crire dans arguments, passer leur adresse !


v o id readarray ( double * array , i n t n ) { i n t i; f o r ( i =0; i < n ; i ++) i f ( scanf ( " %l f " , &( array [ i ])) != 1) i n v a l i d _ i n p u t _ e r r o r (); }

aux nombreuses contraintes dutilisation

Pratique pour implmenter des exceptions, rcuprer les erreurs dans les programmes...
1 2

Permet de ne lire que si le format correspond. Renvoie nombre dlments lus Extrmement pratique pour faire de lanalyse syntaxique simple (avant dutiliser gnrateurs danalyseurs la flex/bison) Version permettant de lire dans des chiers, depuis des chanes...
C avant C UV2 INF 446 TLCOM Bretagne/Info/HPCAS E E S. E VEN, S. G UELTON & R. K ERYELL 277 / 361

# i n c l u d e < stdio .h > # i n c l u d e < malloc .h > # i n c l u d e < setjmp .h > / S t o c k e l t a t du p r o c e s s e u r / jmp_buf buff ; v o id throw_her e () { / R e v i e n s dans l t a t s a u v e g a r d en r e n v oy an t 1au s e t j m p ( ) . . . donc s a u t e dans l e b l o c s u i v a n t l e s e t j m p ( ) / longjmp ( buff , 1);

10

C avant C UV2 INF 446 TLCOM Bretagne/Info/HPCAS E E S. E VEN, S. G UELTON & R. K ERYELL 278 / 361

Bibliothques

Entres-sorties

Bibliothques

Entres-sorties

goto non locaux


}
12

(II)

goto non locaux


} / Ce b l o c s i m u l e un c a t c h ( ) l a Java . . . /
32

(III)

14

16

18

20

i n t main () { / La s u b t i l i t e s t dans l e s v o l a t i l e n c e s s a i r e pour p r v e n i r l e c o m p i l a t e u r qu i l va s e p a s s e r de s c h o s e s b i z a r r e e t donc que l e s v a r i a b l e s m i s e s en r e g i s t r e d o i v e n t t r e s y n c h r o n i s e s s o u v e n t av e c l a mmoire s i n on p l a n t a g e enO3 . . . / char * v o l a t i l e t = NULL ; / de s donnes . . . / char ** v o l a t i l e ptr_tab = NULL ; / S au v e g ar de dans b u f f l t a t c ou r an t : / i f ( setjmp ( buff )) { // A f f i c h e de s i n f o s fprintf ( stderr , " p o i n t e r t : %p\n" , t ); fprintf ( stderr , " p o i n t e r ptr_tab : %p\n" , ptr_tab ); fflush ( stderr ); free ( ptr_tab [1]); free ( ptr_tab ); r e t u r n 10;

/ I c i commence l q u i v a l e n t du b l o c du t r y l a Java /
34

36

t = ( char *) malloc (100); fprintf ( stderr , " p o i n t e r t : %p\n" , t ); ptr_tab = ( char **) malloc ( s i z e o f ( char *) * 2); fprintf ( stderr , " p o i n t e r ptr_tab : %p\n" , ptr_tab ); ptr_tab [1] = t ;

38

40

22

42

24

44

/ Lance une e x c e p t i o n l a Java / throw_here (); //On ne d e v r a i t j am ai s a r r i v e r j u s q u i c i . . . r e t u r n 0; }

26

46

28

48

30

C avant C UV2 INF 446 TLCOM Bretagne/Info/HPCAS E E S. E VEN, S. G UELTON & R. K ERYELL 279 / 361

C avant C UV2 INF 446 TLCOM Bretagne/Info/HPCAS E E S. E VEN, S. G UELTON & R. K ERYELL 280 / 361

Bibliothques

GNOME

Bibliothques

GNOME

Le plan
1

GNOME
Modle mmoire & allocation Entres-sorties GNOME diteur exemple dEmacs Tuning de son clavier Compilation Modularisation Mise au point Dvermineur (debugger) Analyse mmoire Extensions Du C pour le graphisme C++ Dlires Le btisier Concours de programmes incomprhensibles Conclusion Index Table des matires

(I)

2 3

Introduction Bibliographie Petite histoire Langage Gnralits Un ordinateur ? Mais quest-ce ? Les bases de la numrologie Calcul binaire Dclarations Gnralits Types des objets Porte Expressions Smantique oprateurs Coercition de type Instructions Prprocesseur Bibliothques

9 10 11 12

Systme de fentrage & applications bien intgrs Pour simplier dveloppement, reposent sur nombreuses bibliothques regroupes dans http://www.gtk.org (origine : GIMP Toolkit (GNU Image Manipulation Program))
Multi-langages de programmation http://www.gtk.org/bindings.html Multi-OS et multi-systme graphique : X11/Unix, Windows, Framebuffer (cran brut) Glib : bas niveau : gestion structures de donnes en C, portabilit, processus lgers, gestion dvnements, objets GDK & GDKPixBuf : afchages graphiques GTK : objets et gadgets graphiques : menus, boutons... Pango : afchage des textes en graphique ATK : accessibilit GObject : couche objet indpendante du langage (utile en C !)

13

14

6 7 8

15 16 17

Glade : constructeur interactif dinterface gnrant du XML interprt par bibliothque http://glade.gnome.org
C avant C UV2 INF 446 TLCOM Bretagne/Info/HPCAS E E S. E VEN, S. G UELTON & R. K ERYELL 282 / 361

C avant C UV2 INF 446 TLCOM Bretagne/Info/HPCAS E E S. E VEN, S. G UELTON & R. K ERYELL 281 / 361

Bibliothques

GNOME

diteur exemple dEmacs

Glib

(I)

Le plan
1

Sous Linux/Debian
1 2

apt - get install libglib2 .0 -0 libglib2 .0 - doc libglib2 .0 -0 - dbg \ libglib2 .0 - data libglib2 .0 - dev

Introduction Bibliographie Petite histoire Langage Gnralits Un ordinateur ? Mais quest-ce ? Les bases de la numrologie Calcul binaire Dclarations Gnralits Types des objets Porte Expressions Smantique oprateurs Coercition de type Instructions Prprocesseur Bibliothques

9 10 11 12

13

14

6 7 8
C avant C UV2 INF 446 TLCOM Bretagne/Info/HPCAS E E S. E VEN, S. G UELTON & R. K ERYELL 283 / 361

15 16 17

Modle mmoire & allocation Entres-sorties GNOME diteur exemple dEmacs Tuning de son clavier Compilation Modularisation Mise au point Dvermineur (debugger) Analyse mmoire Extensions Du C pour le graphisme C++ Dlires Le btisier Concours de programmes incomprhensibles Conclusion Index Table des matires

C avant C UV2 INF 446 TLCOM Bretagne/Info/HPCAS E E S. E VEN, S. G UELTON & R. K ERYELL 284 / 361

diteur exemple dEmacs

diteur exemple dEmacs

diteur de texte
Besoin dun diteur de texte pour taper les sources du programme Augmentation de la productivit
Modes spcialiss pour langages (navigateurs de classes, coloration syntaxique, remise en forme...) Mode compilation/correction derreur Mode debogueur

(I)

Emacs : LE diteur
Dvelopp depuis annes 1970 par Richard M. Stallman (sur TOPS20...) Vritable systme dexploitation portable
Gre processus Gre communication Programm en C mais programmable en Emacs Lisp, couche oriente objet Pas la peine dapprendre yet another language Peut aussi servir diter des textes

(I)

Essayer davoir un systme portable

Beaucoup dapplication existent

Axiome
Tout lve devrait matriser au moins un diteur de texte avant ce cours... Eclipse, Kate, vim, Emacs...

Correcteur orthographique (M-x flyspell-mode ou menu Tools/Spell Checking) Gestion de courriel et news (GNUS) Navigateur WWW et diteur SGML/HTML/WiKi Serveur WWW Clients IRC
C avant C UV2 INF 446

C avant C UV2 INF 446 TLCOM Bretagne/Info/HPCAS E E S. E VEN, S. G UELTON & R. K ERYELL 285 / 361

TLCOM Bretagne/Info/HPCAS E E

S. E VEN, S. G UELTON & R. K ERYELL

286 / 361

diteur exemple dEmacs

diteur exemple dEmacs

Emacs : LE diteur
Tableur Mode LaTeX quasi-WYSIWYG Connexions distance Shell de commande Lecture de documentation et manuels Comparaison et fusion interactives de textes et rpertoires (menus Tools/Compare et Tools/Compare) Calendrier et agenda Calculatrice Logiciel de dessin ASCII-art Jeux (menu Tools/Games) et documentation Psychanalyste (M-x doctor) Traduction en morse (M-x morse-region) conomiseurs dcran (M-x zone) Gestion de sessions, de fentres

(II)

Emacs : LE diteur
Multiencodage des caractres (menu Options/MULE Multilingual Environment) 2 versions diffrentes
GNU/Emacs

(III)

Plus avanc en programmation Lisp Mode texte possible (dans terminal, y compris mulation des menus !) en plus du mode graphique Religion de RMS

XEmacs
Plus avanc en graphisme Conguration par dfaut plus sympathique

Compromis trouver par chacun entre un outil qui fait tout et plein doutils qui ne font rien... Plus quun diteur, un tat desprit

Fonctionne sur tous systmes dexploitations communs


C avant C UV2 INF 446 TLCOM Bretagne/Info/HPCAS E E S. E VEN, S. G UELTON & R. K ERYELL 287 / 361 C avant C UV2 INF 446 TLCOM Bretagne/Info/HPCAS E E S. E VEN, S. G UELTON & R. K ERYELL 288 / 361

diteur exemple dEmacs

diteur exemple dEmacs

Un diteur abordable
Au dpart tait le verbetexte... Un des premiers diteur plein cran interactif (197x)... ... et un des derniers tre pass au mode graphique (X11) Mode texte + nombreuses fonctionnalits nombreuses commandes sujet de moqueries par adorateurs de sous-diteurs Mode graphique fentr : plupart des choses avec menus, Simple pour commencer ! touches de fonctions, tooltips... Pas de mode commande/mode insertion troublant comme dans vi Auto-document : C-h (help) Couper-coller congurable en C-x/C-c/C-v pour inconditionnels Windows (menu Options/CUA) (Common User Access)
car ces squences sont dj utilises par Emacs standard... Est-ce bien ncessaire avec mode couper/coller souris (3 boutons) dEmacs ?
C avant C UV2 INF 446 TLCOM Bretagne/Info/HPCAS E E S. E VEN, S. G UELTON & R. K ERYELL

(I)

Concepts de base
Importants connatre Frame : fentre au sens du gestionnaire de fentre graphique (bords, dcorations...) ou terminal virtuel
Une frame contient plusieurs windows Des frames peuvent tre afches sur plusieurs crans ! (menu File/New frame on Display...)

(I)

Window : fentre au sens dEmacs


Contenue dans une frame Contient un buffer

Buffer : contient du texte gnralement associ un chier et ditable


Peut tre afch dans une ou plusieurs windows

Minibuffer : en gnral dans la windows du bas, sert rpondre des questions dEmacs ou afcher des messages

C avant C UV2 INF 446 289 / 361 TLCOM Bretagne/Info/HPCAS E E S. E VEN, S. G UELTON & R. K ERYELL 290 / 361

diteur exemple dEmacs

diteur exemple dEmacs

Kit de survie

(I)

Kit de survie

(II)

C-g (Control G) : interrompt Emacs quand on est perdu (rpondre question incomprhensible... ) M-x viper-mode (Mta X) passe en mode vi pour les inconditionnels (C-z change entre mode vi et emacs ! The newest Emacs VI-emulation mode. (also, A VI Plan for Emacs Rescue or the VI PERil.) mulations pour de nombreux autres diteurs Menu Help Souvent conguration X11 PC dnissent mal Mta et il y a confusion touches Mta et Alt Usage de la souris trs pratique
Bouton gauche souris : slectionne Bouton droit souris : n de la slection Double clic bouton droit souris : n de la slection et coupe Bouton du milieu : insre

C avant C UV2 INF 446 TLCOM Bretagne/Info/HPCAS E E S. E VEN, S. G UELTON & R. K ERYELL 291 / 361

C avant C UV2 INF 446 TLCOM Bretagne/Info/HPCAS E E S. E VEN, S. G UELTON & R. K ERYELL 292 / 361

diteur exemple dEmacs

diteur exemple dEmacs

Emacs est lourd


normment de possibilit Un vrai systme dexploitation... temps de boot Reboote-t-on une machine pour dmarrer chaque application ? Non... Lancer 1 emacs Ouvrir autant de windows ou frames que ncessaire dition client-serveur
Un Emacs attend des demandes dditions
Rajouter dans son ~/.emacs
1

(I)

Emacs est lourd

(II)

Changer diteur par dfaut Unix dans son ~/.bashrc


1 3

#Editwithemacswithoutbooting anewEmacs i f there i s one . . . :) alias e= emac s c l i ent l t e r n a t e e d i t o r =emacs a #Setthedefault editor export EDITOR=" emacsclient alternatee d i t o remacs+ d%s" %

Utiliser mode mozex de Mozilla par exemple pour sous-traiter formulaires WWW emacsclient

( server-start)

Une demande ddition est envoye par commande emacsclient Quand dition termine avec Emacs, taper C-x # qui dbloque emacslient
C avant C UV2 INF 446 TLCOM Bretagne/Info/HPCAS E E S. E VEN, S. G UELTON & R. K ERYELL 293 / 361 C avant C UV2 INF 446 TLCOM Bretagne/Info/HPCAS E E S. E VEN, S. G UELTON & R. K ERYELL 294 / 361

diteur exemple dEmacs

diteur exemple dEmacs

Vers une analyse grammaticale des commandes Emacs (I)

Compilation

(I)

Parfois M- fait comme C- mais plus fort ou invers


C-v : scroll-up M-v : scroll-down

Menu Tools/Compile... Ouvre fentre pour voir erreurs de compilation Clic avec bouton milieu sur messages derreur pour sauter dans chier correspondant Si compilation via connexion distante, rcupration du chier slectionn !

C-u inverse ou modie une commande en passant un argument C-x 4 fait quelque chose dans une nouvelle windows C-x 5 fait quelque chose dans une nouvelle frame M-1 M-2 M-3 truc : applique 123 fois truc C-c commandes spciques au mode courant

C avant C UV2 INF 446 TLCOM Bretagne/Info/HPCAS E E S. E VEN, S. G UELTON & R. K ERYELL 295 / 361

C avant C UV2 INF 446 TLCOM Bretagne/Info/HPCAS E E S. E VEN, S. G UELTON & R. K ERYELL 296 / 361

diteur exemple dEmacs

diteur exemple dEmacs

Correction erreurs de syntaxe la vole


Inspir du mode de correction syntaxique M-x flyspell-mode M-x flymake-mode Ide : lance constamment des compilations et analyse messages derreurs en temps rel ! Afche erreur en rose et message en tooltip Ncessite de rajouter une rgle de compilation dans son Makefile du style
1 2

(I)

Dbogueurs dans Emacs


GUD (Grand Unied Debugger) Offre interface uniforme depuis Emacs plein de debogueurs pour diffrents langages
GDB (M-x gdb), DBX, SDB, XDB Perl (M-x perldb) PDB (Python ) (M-x pdb) bash debugger (M-x bashdb) JDB (Java)

(I)

check - syntax : gcc -o nul -S $ { CHK_SOURCE S }

Excution suivi dans buffer source dEmacs par => Possible de causer directement au dbogueur dans buffer GUD M-x gud-tooltip-mode pour rajouter afchage valeur de variables sous forme de tooltip Mode multi-buffer afchant variables, pile, assembleur...

Pour activer automatiquement, mettre dans son ~/.emacs


1

( add-hook f i n d - f i l e - h o o k s f l y m a k e - f i n d - f i l e - h o o k )

C avant C UV2 INF 446 TLCOM Bretagne/Info/HPCAS E E S. E VEN, S. G UELTON & R. K ERYELL 297 / 361

C avant C UV2 INF 446 TLCOM Bretagne/Info/HPCAS E E S. E VEN, S. G UELTON & R. K ERYELL 298 / 361

diteur exemple dEmacs

diteur exemple dEmacs

Tags
Entits dun programme dnies dans de nombreux chiers Difcile pour programmeur de trouver dnition dune entit Pour sy retrouver, constitution dun chier dindex TAGS Outil etags dindexation compatible avec nombreux langages M-. permet de trouver premire dnition Nombreuses autres fonctionnalits Rajouter dans Makefile
1

(I)

Speedbar

(I)

Rajoute fentre afchant informations supplmentaires en fonction mode courant


Afche tags Afche versions Afche chiers Afche info

tags : etags $ { T O U S _ M E S _ S O U R C E S }

M-x speedbar

M-x visit-tags-table permet de choisir une table de tags Variable tags-table-list pour utiliser plusieurs tables de tags Existe aussi pour vi (ctags)
C avant C UV2 INF 446 TLCOM Bretagne/Info/HPCAS E E S. E VEN, S. G UELTON & R. K ERYELL 299 / 361 C avant C UV2 INF 446 TLCOM Bretagne/Info/HPCAS E E S. E VEN, S. G UELTON & R. K ERYELL 300 / 361

diteur exemple dEmacs

diteur exemple dEmacs

dition de chiers binaires

(I)

Ncessit dun systme de gestion de version


Tout nest pas correct du premier coup Besoin dexprimenter plein de choses Quelque chose de faux aujourdhui peut tre utile demain

(I)

M-x hexl-mode pour entrer, C-c C-c pour sortir Afche la fois caractres normaux et hexadcimal Commandes pour se dplacer adresse prcise Commandes pour insrer en dcimal, octal, hexadcimal

Vie dun logiciel ou dun document compliqu : dveloppement, mise au point, nombreuses versions en circulation, corrections sur de vieilles versions... Travail souvent plusieurs Mmoire qui anche ( pourquoi ai-je modi ce /etc/apache/httpd.conf?) Besoin de garder des traces du pass !
1 2

# i f n d e f lint s t a t i c char vcid [] = "% %" ; W # e n d i f / l i n t /

C avant C UV2 INF 446 TLCOM Bretagne/Info/HPCAS E E S. E VEN, S. G UELTON & R. K ERYELL 301 / 361

C avant C UV2 INF 446 TLCOM Bretagne/Info/HPCAS E E S. E VEN, S. G UELTON & R. K ERYELL 302 / 361

diteur exemple dEmacs

diteur exemple dEmacs

Ncessit dun systme de gestion de version

(II)

Gestion de version avec Emacs


Extrmement pratique davoir gestion de version dans diteur
Rcupre une version Soumet une nouvelle version Compare diffrentes versions avec diffrentes couleurs Fusionne diffrentes versions dite chiers pas jour

(I)

Exemple : chane de caractres %W% remplace information sur le chier par outil de gestion de version et retrouve par commande what : permet davoir version sur chaque unit de compilation (bibliothques utilises...)

Mode gnrique de contrle de version indpendant de loutil utilis ! vite davoir trop sinvestir dans un outil spcique Menu Tools/Version Control (apprentissage des raccourcis avec le temps...) dont
Register rajoute chier dans systme de gestion de version (choisi par dfaut ou le mme que dautres chiers dans rpertoire) Check In/Out entre une nouvelle version (qui devient non crivable) ou sort dernire version (crivable pour dition)

C avant C UV2 INF 446 TLCOM Bretagne/Info/HPCAS E E S. E VEN, S. G UELTON & R. K ERYELL 303 / 361

C avant C UV2 INF 446 TLCOM Bretagne/Info/HPCAS E E S. E VEN, S. G UELTON & R. K ERYELL 304 / 361

diteur exemple dEmacs

diteur exemple dEmacs

Gestion de version avec Emacs


Compare with Base Version afche diffrences avec version courante Show History afche historique du chier VC Directory Listing afche chiers en cours de modication et sous contrle de versions Insert Header rajoute un commentaire appropri propre au type de chier dit avec information sur la version. Exemple en C /* $Id$ */ qui aprs entre dans RCS devient
1

(II)

Gestion de version en local

(I)

SCCS et CSSC : canal historique RCS


cre des chiers ,v qui contiennent historique des versions Cachables dans rpertoires RCS Si partage des chiers en local plusieurs, bien grer les droits (en criture pour groupe ou ACL) Commandes de base
ci pour faire un check-in : mmorise une nouvelle version co pour faire un check-out : rcupre une version donersionsne ou dernire version pour diter

/ $Id : t r a n s . t e x , v 1 . 2 5 2009/04/20 1 2 : 3 1 : 3 9 k e r y e l l Exp$ /

pour voir version dans le chier sans outil de gestion de version sous le coude Update ChangeLog cre/met jour un chier ChangeLog avec lhistorique du chier dedans. Pour voir historique dans chier sans besoin outil de gestion de version

Subversion peut aussi tourner en local sur machine

C avant C UV2 INF 446 TLCOM Bretagne/Info/HPCAS E E S. E VEN, S. G UELTON & R. K ERYELL 305 / 361

C avant C UV2 INF 446 TLCOM Bretagne/Info/HPCAS E E S. E VEN, S. G UELTON & R. K ERYELL 306 / 361

diteur exemple dEmacs

diteur exemple dEmacs

Gestion de version distance


Souvent si dveloppement collaboratif, serveur de gestion de versions distant CVS
Historique Pas de transaction atomique sur plusieurs chiers Pas de modication des rpertoires possibles

(I)

Gestion de version distance

(II)

Nombreux autres systmes libres Autres systmes commerciaux

Subversion If C gives you enough rope to hang yourself, think of Subversion as a sort of rope storage facility. Brian W. F ITZPATRICK (tir du livre ofciel de Subversion)
Transactions atomiques Modication globale des rpertoires possibles Facilits pour travailler en dconnect
C avant C UV2 INF 446 TLCOM Bretagne/Info/HPCAS E E S. E VEN, S. G UELTON & R. K ERYELL 307 / 361

C avant C UV2 INF 446 TLCOM Bretagne/Info/HPCAS E E S. E VEN, S. G UELTON & R. K ERYELL 308 / 361

diteur exemple dEmacs

diteur exemple dEmacs

Gestion de version avec Emacs pour CVS et SVN (I)

TRAMP
Besoin dditer des chiers sur machines distances

(I)

Modes spciques en plus des fonctions de base de gestion de version dEmacs (menu Tools/Version Control) Si ditions simultanes contradictoires : besoin de rsoudre des conits mode rsolution de conit bas sur mode Emacs Merge Pour CVS : mode PCL-CVS
Rajoute menu Afchage hirarchie de chiers avec information sur version Fonction de rsolution de conits

TRAMP : Transparent Remote (le) Access, Multiple Protocol

Sait utiliser ssh, rsh, rlogin, telnet, ftp, rcp, scp, rsync, smbclient Permet aussi dditer chiers avec dautres droits (su et sudo) : pratique pour administration systme Permet de passer par plusieurs mthodes et machines Exemples /MACHINE:LOCALNAME /USER@MACHINE:/PATH/TO.FILE /multi:rsh:out@gate:telnet:kai@real.host:/path/to.file Gre les versions distance

Pour SVN (SubVersion) : mode SVN Status


Interface du style de la prcdente

C avant C UV2 INF 446 TLCOM Bretagne/Info/HPCAS E E S. E VEN, S. G UELTON & R. K ERYELL 309 / 361

C avant C UV2 INF 446 TLCOM Bretagne/Info/HPCAS E E S. E VEN, S. G UELTON & R. K ERYELL 310 / 361

diteur exemple dEmacs

diteur exemple dEmacs

Tuning de son clavier

Modes spciques des langages

(I)

Le plan
1

De nombreux modes disponibles pour diter divers langages et formats de donnes Mode C (info CC-mode)
Gre nombreux langages syntaxe la C (C++, Objective-C, Java, CORBA IDL, AWK...) Dplacements dans les structures syntaxiques Indentation automatique et congurable (de manire interactive) avec nombreux styles prdnis (gnu, k&r, bsd, stroustrup...) Caractres lectriques : rindentation ds quon tape des {, }, ;, (, ), etc Retour chariot automatique, effacement glouton des espaces Peut afcher rgion aprs prprocesseur Coloration syntaxique congurable

2 3

Introduction Bibliographie Petite histoire Langage Gnralits Un ordinateur ? Mais quest-ce ? Les bases de la numrologie Calcul binaire Dclarations Gnralits Types des objets Porte Expressions Smantique oprateurs Coercition de type Instructions Prprocesseur Bibliothques

9 10 11 12

13

14

6 7 8

15 16 17

Modle mmoire & allocation Entres-sorties GNOME diteur exemple dEmacs Tuning de son clavier Compilation Modularisation Mise au point Dvermineur (debugger) Analyse mmoire Extensions Du C pour le graphisme C++ Dlires Le btisier Concours de programmes incomprhensibles Conclusion Index Table des matires

C avant C UV2 INF 446 TLCOM Bretagne/Info/HPCAS E E S. E VEN, S. G UELTON & R. K ERYELL 311 / 361

C avant C UV2 INF 446 TLCOM Bretagne/Info/HPCAS E E S. E VEN, S. G UELTON & R. K ERYELL 312 / 361

diteur exemple dEmacs

Tuning de son clavier

diteur exemple dEmacs

Tuning de son clavier

Retour aux sources : clavier QWERTY


Use the source, Luke Clavier franais (AZERTY) pas du tout adapt la programmation ~"!@#$%^&*()_-+={}[]|\$ Taper des chiffres : pas mieux... Contorsions horribles des doigts Sous Windows cest pire \\\\\ perl encore pire Le langage C (et linformatique gnralement) a t conu par des gens qui navaient pas de clavier franais Achetez des claviers US (pas GB ! ) Encore mieux quun clavier de PC US : un clavier de Sun US (touches Copy/Paste/Cut/...)
C avant C UV2 INF 446 TLCOM Bretagne/Info/HPCAS E E S. E VEN, S. G UELTON & R. K ERYELL

(I)

Revamper un clavier AZERTY en QWERTY


Encore plus hype ! Mettez des autocollants sur les touches qui changent entre les 2 Un clavier AZERTY a une touche de plus quun clavier QWERTY Utilisation possible de cette 105me touche pour autre chose Exemple : remplacer </> par Undo/Redo de Sun (pour Emacs, OpenOfce...) Fichier /etc/X11/Xmodmap : ! Put Undo/Redo on the <> key: keycode 0x5E = Undo Redo Si cela ne marche pas tout seul en fonction de son gestionnaire de fentre : xmodmap /etc/X11/Xmodmap
C avant C UV2 INF 446

(I)

313 / 361

TLCOM Bretagne/Info/HPCAS E E

S. E VEN, S. G UELTON & R. K ERYELL

314 / 361

diteur exemple dEmacs

Tuning de son clavier

diteur exemple dEmacs

Tuning de son clavier

Des accents !
Belle documentation et commentaires en franais Incompatible avec les claviers QWERTY ? Mais comment faire en AZERTY des ? Comment taper toutes les langues du monde simplement ? Concept de la touche Compose des Sun pour composer des caractres complexes avec Compose+Accent+Lettre ou autre Revamper la touche Contrle de droite par exemple avec dans son /etc/X11/Xmodmap : ! Compose complex characters with Control_R: remove Control = Control_R keysym Control_R = Multi_key ou encore mieux le compose:rctrl dans transparent suivant

(I)

Touches Meta et Alt

(I)

Nombreuses touches permettant de modier le comportement du gestionnaire de fentre ou dun diteur Shift, Control, Alt, Meta, Super, Hyper... Sources de blagues racistes anti-Emacsiennes Meta et Alt sont les principales en plus de la touche majuscule Malheureusement sous PC X11 grosse confusion (programmeurs trop jeunes ? ) Besoin de rajouter dans son /etc/X11/xorg.conf ou /etc/X11/XF86Config-4

C avant C UV2 INF 446 TLCOM Bretagne/Info/HPCAS E E S. E VEN, S. G UELTON & R. K ERYELL 315 / 361

C avant C UV2 INF 446 TLCOM Bretagne/Info/HPCAS E E S. E VEN, S. G UELTON & R. K ERYELL 316 / 361

diteur exemple dEmacs

Tuning de son clavier

diteur exemple dEmacs

Tuning de son clavier

Touches Meta et Alt

(II)

Avec lexprience

(I)

Section "InputDevice" Identifier "Keyboard0" Driver "kbd" Option "XkbRules" "xorg" Option "XkbModel" "pc105" Option "XkbLayout" "us" # /usr/share/X11/xkb/rules/base.lst: # altgr-intl us: International (AltGr dead keys) Option "XkbVariant" "altgr-intl" # Use the RightCtrl key as a compose key to build complex # characters, keep LeftAlt as Alt like traditional X11 unix and # use LeftWindows key as Meta. Put Euro on AltGr E. For fun try # exotic characters on the keypad too: Option "XkbOptions" "compose:rctrl,altwin:left_meta_win,eurosign:e,keypad:oss" EndSection

Chacun se construit sur le long terme son environnement tudier les raccourcis de son gestionnaire de fentre
Choisir ventuellement un autre Adapter (touche Menu)

tudier les raccourcis de son gestionnaire de diteur


Touche Impression pour la compltion automatique Hippie dEmacs

C avant C UV2 INF 446 TLCOM Bretagne/Info/HPCAS E E S. E VEN, S. G UELTON & R. K ERYELL 317 / 361

C avant C UV2 INF 446 TLCOM Bretagne/Info/HPCAS E E S. E VEN, S. G UELTON & R. K ERYELL 318 / 361

Compilation

Compilation

Le plan
1

Principe
Modle mmoire & allocation Entres-sorties GNOME diteur exemple dEmacs Tuning de son clavier Compilation Modularisation Mise au point Dvermineur (debugger) Analyse mmoire Extensions Du C pour le graphisme C++ Dlires Le btisier Concours de programmes incomprhensibles Conclusion Index Table des matires

(I)

2 3

Introduction Bibliographie Petite histoire Langage Gnralits Un ordinateur ? Mais quest-ce ? Les bases de la numrologie Calcul binaire Dclarations Gnralits Types des objets Porte Expressions Smantique oprateurs Coercition de type Instructions Prprocesseur Bibliothques

9 10 11 12

Ordinateur capable dexcuter que instructions machines


1

ld r2 , 456( r5 ) add r1 , r2 , r3 jmp 0 x1234

13

Besoin de traducteur langage haut niveau vers instructions machine compilation


Allocation des objets dans mmoire Gnration squences dinstructions quivalentes au programme C

14

6 7 8

15 16 17

C avant C UV2 INF 446 TLCOM Bretagne/Info/HPCAS E E S. E VEN, S. G UELTON & R. K ERYELL 319 / 361

C avant C UV2 INF 446 TLCOM Bretagne/Info/HPCAS E E S. E VEN, S. G UELTON & R. K ERYELL 320 / 361

Compilation

Compilation

Compilateur gcc
Compilateur portable de langages style C (C++, Objective C) de la communaut GNU Plus accent sur portabilit que sur performances normment doptions : voir info gcc Compilation directe (avec dition de lien)
1

(I)

Compilateur gcc

(II)

gcc toto . c -o toto

Simple compilation
1

gcc -c toto . c

-g compile avec informations pour debogueur (moins optimis en gnral) -Wall avertit de nombreux problmes -S gnre un chier dassemblage .s -E gnre source aprs passage dans prprocesseur -On optimise au niveau n -std=c99 choisit le dialecte

gnre un toto.o dition de liens


1

gcc toto . o titi . o -o toto

Quelques options trs utiles


C avant C UV2 INF 446 TLCOM Bretagne/Info/HPCAS E E S. E VEN, S. G UELTON & R. K ERYELL 321 / 361 C avant C UV2 INF 446 TLCOM Bretagne/Info/HPCAS E E S. E VEN, S. G UELTON & R. K ERYELL 322 / 361

Compilation

Compilation

Makele
Systme daide la construction de programmes Dnit ce qui doit tre fait Dnit comment cela doit tre fait Construction paresseuse des chiers indispensable pour gros projets : ne compile que ce qui nest pas jour Compare date de cible avec dates de sources dordinateurs dont horloges mal synchronises... protocoles synchronisation style NTP si utilisation utilisation

(I)

Makele
Rgles de type
1

(II)

cible : sources action1 action2 ...

Actions commencent par une tabulation ! Rgles implicites qui simplient la tche
Pour compiler un programme C toto.c avec make toto sera implicitement utilises les rgles
1 2

Moteur make et chier de conguration par dfaut makefile ou Makefile Premire cible trouve excute en premier minimal pour compiler toto.c
1

$ (CC) -c $ (CPPFLAGS) $ (CFLAGS) toto . c $ (CC) $ (LDFLAGS) toto . o $ (LOADLIBES) $ ( LDLIBS ) -o toto

Makefile

Pour une dition de lien avec une rgle simple


1

x:y.oz.o

all : toto

sont compils automatiquements puis lis les x.c, y.c et z.c


C avant C UV2 INF 446 S. E VEN, S. G UELTON & R. K ERYELL 323 / 361 TLCOM Bretagne/Info/HPCAS E E S. E VEN, S. G UELTON & R. K ERYELL 324 / 361

C avant C UV2 INF 446 TLCOM Bretagne/Info/HPCAS E E

Compilation

Modularisation

Makele

(III)

Le plan
1

Variables pour simplier/paramtrer makeles


1

CFLAGS= - O4 - Wall -g - std = c99

2 3

Possible de passer en paramtre lors de lappel


1

make CFLAGS = - O4 - Wall -g - std = c99 toto


4

voire au niveau variable du shell


1

e x p o r t CFLAGS = - O4 - Wall -g - std = c99


5

Voir info make


6 7 8
C avant C UV2 INF 446 TLCOM Bretagne/Info/HPCAS E E S. E VEN, S. G UELTON & R. K ERYELL 325 / 361

Introduction Bibliographie Petite histoire Langage Gnralits Un ordinateur ? Mais quest-ce ? Les bases de la numrologie Calcul binaire Dclarations Gnralits Types des objets Porte Expressions Smantique oprateurs Coercition de type Instructions Prprocesseur Bibliothques

9 10 11 12

13

14

15 16 17

Modle mmoire & allocation Entres-sorties GNOME diteur exemple dEmacs Tuning de son clavier Compilation Modularisation Mise au point Dvermineur (debugger) Analyse mmoire Extensions Du C pour le graphisme C++ Dlires Le btisier Concours de programmes incomprhensibles Conclusion Index Table des matires

C avant C UV2 INF 446 TLCOM Bretagne/Info/HPCAS E E S. E VEN, S. G UELTON & R. K ERYELL 326 / 361

Modularisation

Modularisation

Modularisation

(I)

Fonctions

(I)

Besoin de grer la complexit


Lisibilit Mise au point Maintenabilit Rutilisabilit Portabilit Extensibilit

Factoriser le plus de code dans des fonctions Regrouper fonctions relies par thmatique dans mmes chiers Mettre toutes fonctions internes (non interfaces) en static

Diviser pour rgner Sparer interface dimplmentation

C avant C UV2 INF 446 TLCOM Bretagne/Info/HPCAS E E S. E VEN, S. G UELTON & R. K ERYELL 327 / 361

C avant C UV2 INF 446 TLCOM Bretagne/Info/HPCAS E E S. E VEN, S. G UELTON & R. K ERYELL 328 / 361

Modularisation

Modularisation

Fichiers

(I)

Utiliser des symboles

(I)

Unit de compilation en C Base de la compilation plus rapide avec make Base de la visibilit en C car pas de private ( static ou pas) Mettre en-ttes de fonctions et variables dans 2 chiers .h au moins
Fichier dnissant interfaces publiques (non static ) avec fonctions, variables mais aussi types et macros (style projet.h) Fichier dnissant objets pour compiler les module avec dnition des objets internes : fonctions, variables, types et macros (style projet-local.h)

viter de mettre des constantes explicites dans programmes


1

double v [100][100 ] ;

Programme difcile comprendre Difcile modier, peu adaptable

Utiliser des constantes factorises


1

Gnration automatique avec utilisation doutils comme cproto ou protoize

enum{ T A I L L E _ V E C T E U R = 100 }; # d e f i n e NOM_PROJE T " g r o s _ p r o j e t " const double d = 3.2; const char * message = " ne bougez p l u s ! " double v [ T A I L L E _ V E C T E U R ][ T A I L L E _ V E C T E U R ];

viter le prprocesseur pour a car pas objet de premire classe

C avant C UV2 INF 446 TLCOM Bretagne/Info/HPCAS E E S. E VEN, S. G UELTON & R. K ERYELL 329 / 361

C avant C UV2 INF 446 TLCOM Bretagne/Info/HPCAS E E S. E VEN, S. G UELTON & R. K ERYELL 330 / 361

Mise au point

Mise au point

Dvermineur (debugger)

Le plan
1

Le plan
Modle mmoire & allocation Entres-sorties GNOME diteur exemple dEmacs Tuning de son clavier Compilation Modularisation Mise au point Dvermineur (debugger) Analyse mmoire Extensions Du C pour le graphisme C++ Dlires Le btisier Concours de programmes incomprhensibles Conclusion Index Table des matires
1

2 3

Introduction Bibliographie Petite histoire Langage Gnralits Un ordinateur ? Mais quest-ce ? Les bases de la numrologie Calcul binaire Dclarations Gnralits Types des objets Porte Expressions Smantique oprateurs Coercition de type Instructions Prprocesseur Bibliothques

9 10 11 12

2 3

13

14

Introduction Bibliographie Petite histoire Langage Gnralits Un ordinateur ? Mais quest-ce ? Les bases de la numrologie Calcul binaire Dclarations Gnralits Types des objets Porte Expressions Smantique oprateurs Coercition de type Instructions Prprocesseur Bibliothques

9 10 11 12

13

14

6 7 8

15 16 17

6 7 8

15 16 17

Modle mmoire & allocation Entres-sorties GNOME diteur exemple dEmacs Tuning de son clavier Compilation Modularisation Mise au point Dvermineur (debugger) Analyse mmoire Extensions Du C pour le graphisme C++ Dlires Le btisier Concours de programmes incomprhensibles Conclusion Index Table des matires

C avant C UV2 INF 446 TLCOM Bretagne/Info/HPCAS E E S. E VEN, S. G UELTON & R. K ERYELL 331 / 361

C avant C UV2 INF 446 TLCOM Bretagne/Info/HPCAS E E S. E VEN, S. G UELTON & R. K ERYELL 332 / 361

Mise au point

Dvermineur (debugger)

Mise au point

Dvermineur (debugger)

Dbogueur

(I)

Dbogueur
Ncessite davoir dans excutable (ou ailleurs dans cas de systme dexploitation) table des symboles et informations de dbogage (numros de ligne, noms chiers sources...) (stab) : rajouts la compilation avec option -g Programme plus gros, moins optimis Dbogage du noyau du systme dexploitation lui-mme ? Plus subtil...
Utiliser mulateur de machine, machine virtuelle... Modier noyau pour prendre en compte mise au point
Mettre une partie du dbogueur dans noyau Faire tourner interface de dbogage sur autre machine Amorcer machine sur dbogueur noyau au lieu de noyau

(II)

Permet
Analyse post mortem dun programme partir du chier image mmoire (programme, variables...) core Excution pas pas Dsassemblage et afchage de variables, mmoire Modication programme et variables Points darrts (break-points) certains endroits du programme (ligne, fonction, adresse...) Arrt sur conditions mmoires (watch-points)
Si case mmoire ou variable modie, vrie telle condition... Trs pratique pour dverminer problme sordide dcrasage de case mmoire Si pas de support matriel, trs trs lent (excution pas pas et test de la condition... )

http://heather.cs.ucdavis.edu/~matloff/UnixAndC/CLanguage/Debug.html

Guide to Faster, Less Frustrating Debugging

C avant C UV2 INF 446 TLCOM Bretagne/Info/HPCAS E E S. E VEN, S. G UELTON & R. K ERYELL 333 / 361

C avant C UV2 INF 446 TLCOM Bretagne/Info/HPCAS E E S. E VEN, S. G UELTON & R. K ERYELL 334 / 361

Mise au point

Dvermineur (debugger)

Mise au point

Dvermineur (debugger)

Dbogueur GNU gdb


gdb [options] programme core Sait grer symboliquement nombreux langages Options trs utiles
-p process-id : dbogage processus dj en train de tourner -f : dbogage aussi des processus cr par le programme

(I)

Dbogueur GNU gdb


break pose un point darrt performances... Possible de faire point darrt conditionnel mais watch pose une surveillance de variable ou mmoire performances... trace met des points dchantillonnage de variables pour analyse plus tard des valeurs avec tfind, tdump (programmes temps rel...) clear et delete pour supprimer break-points et watch-points continue lexcution step avance dun ou plusieurs pas next comme step mais sans suivre appels de fonctions stepi et nexti : idem mais au niveau instruction machine backtrace ou bt afche pile des appels de fonctions, option full pour afcher variables lcales en plus frame slectionne un niveau de pile dappels up et down pour se dplacer dans cette pile list afche le source du programme
C avant C UV2 INF 446

(II)

Instructions de base
Toutes les commandes sont abrviables Compltion automatique sur commandes et symboles du programme run arguments : lance programme help thme et apropos quelque-chose pour la documentation en ligne info sur aspects du programmes show sur aspects de gdb set permet de modier comportement et variables du programme

C avant C UV2 INF 446 TLCOM Bretagne/Info/HPCAS E E S. E VEN, S. G UELTON & R. K ERYELL 335 / 361

TLCOM Bretagne/Info/HPCAS E E

S. E VEN, S. G UELTON & R. K ERYELL

336 / 361

Mise au point

Dvermineur (debugger)

Mise au point

Dvermineur (debugger)

Dbogueur GNU gdb

(III)

Dbogueur ddd

(I)

print afche une variable ou zone mmoire. Nombreux modes disponibles display afche aprs chaque commande une variable

Data Display Debugger Surcouche multi-fentre plusieurs dbogueur dont gdb Afchage des variables de manire graphiques (structures...)

Nombreuses interfaces graphiques ou pas : Eclipse, ddd, Emacs... Comme dhabitude : man gdb et surtout info gdb

C avant C UV2 INF 446 TLCOM Bretagne/Info/HPCAS E E S. E VEN, S. G UELTON & R. K ERYELL 337 / 361

C avant C UV2 INF 446 TLCOM Bretagne/Info/HPCAS E E S. E VEN, S. G UELTON & R. K ERYELL 338 / 361

Mise au point

Analyse mmoire

Mise au point

Analyse mmoire

Le plan
1

Mise au point allocation mmoire


Modle mmoire & allocation Entres-sorties GNOME diteur exemple dEmacs Tuning de son clavier Compilation Modularisation Mise au point Dvermineur (debugger) Analyse mmoire Extensions Du C pour le graphisme C++ Dlires Le btisier Concours de programmes incomprhensibles Conclusion Index Table des matires

(I)

2 3

Introduction Bibliographie Petite histoire Langage Gnralits Un ordinateur ? Mais quest-ce ? Les bases de la numrologie Calcul binaire Dclarations Gnralits Types des objets Porte Expressions Smantique oprateurs Coercition de type Instructions Prprocesseur Bibliothques

LA difcult du C
Assurer mmoire correctement utilise (allocation, pointeurs...) Outil commercial avec interface graphique Purify
http://www-306.ibm.com/software/awdtools/purify Instrumentation du code lors de ldition des liens Dtecte
Dbordements de tableaux et variables, y compris statiques et automatiques (dans pile) Fuites mmoires Lecture de mmoire non alloue Erreur dallocations/dsallocation

9 10 11 12

13

14

6 7 8

Interface graphique pour tracer lallocation/dsallocation de toute case mmoire

15 16 17

Valgrind http://en.wikipedia.org/wiki/Valgrind
http://valgrind.org
C avant C UV2 INF 446

C avant C UV2 INF 446 TLCOM Bretagne/Info/HPCAS E E S. E VEN, S. G UELTON & R. K ERYELL 339 / 361

TLCOM Bretagne/Info/HPCAS E E

S. E VEN, S. G UELTON & R. K ERYELL

340 / 361

Mise au point

Analyse mmoire

Mise au point

Analyse mmoire

Mise au point allocation mmoire


Dtecte
Problmes dallocation mmoire Fuite mmoire Ne dtecte pas (encore) dbordement variables statiques ou automatiques Prcision au bit prs Autorise des copies de mmoire non-initialise tant que pas utiliser dans une expression

(II)

Mise au point allocation mmoire

(III)

--malloc-fill=a55a --free-fill=e11e --freelist-vol=1000000000 --track-origins=yes --leak-resolution=high --num-callers=100 --leak-check=full Voir documentation, section MEMCHECK OPTIONS. Fait tourner programme dans machine virtuelle et instrumente programme (rajoute aux accs la mmoire du contrle ou autre)

GCC avec mudap


Instrumentation des accs sensibles (pointeurs, tableaux, chanes de caractres, tas...) Sous-traitance bibliothque libmudflap Vrie absence derreur de mmoire (accs, dbordement...) lors de lexcution Compilation avec option -fmudflap Fonctionnement lexcution contrl par variable denvironnement MUDFLAP_OPTIONS

Diffrents modules disponibles MemCheck Dverminage classique de la mmoire Helgrind Dtection dincohrences dans programmes multi-thread Massif Analyse comportement du tas Cachegring Analyse de comportement de cache pour optimisation. Interface graphique KCacheGrind valgrind --leak-check=yes myprog arg1 arg2 Quelques options de hacker :
C avant C UV2 INF 446 TLCOM Bretagne/Info/HPCAS E E S. E VEN, S. G UELTON & R. K ERYELL 341 / 361

efence - Electric Fence Malloc Debugger


Option -lefence ldition de lien
C avant C UV2 INF 446 TLCOM Bretagne/Info/HPCAS E E S. E VEN, S. G UELTON & R. K ERYELL 342 / 361

Mise au point

Analyse mmoire

Extensions

Mise au point allocation mmoire

(IV)

Le plan
1

Modie malloc() & co Dtecte dbordements en lecture et criture en (ds)allouant des trs gourmand en pages mmoires autour de la zone mmoire mmoire ! Utilis par Pixar depuis 1987

2 3

Permet de dtecter des erreurs non fatales, contrairement aux dvermineurs... avant quelles ne le deviennent !
5

Introduction Bibliographie Petite histoire Langage Gnralits Un ordinateur ? Mais quest-ce ? Les bases de la numrologie Calcul binaire Dclarations Gnralits Types des objets Porte Expressions Smantique oprateurs Coercition de type Instructions Prprocesseur Bibliothques

9 10 11 12

13

14

6 7 8
C avant C UV2 INF 446 TLCOM Bretagne/Info/HPCAS E E S. E VEN, S. G UELTON & R. K ERYELL 343 / 361

15 16 17

Modle mmoire & allocation Entres-sorties GNOME diteur exemple dEmacs Tuning de son clavier Compilation Modularisation Mise au point Dvermineur (debugger) Analyse mmoire Extensions Du C pour le graphisme C++ Dlires Le btisier Concours de programmes incomprhensibles Conclusion Index Table des matires

C avant C UV2 INF 446 TLCOM Bretagne/Info/HPCAS E E S. E VEN, S. G UELTON & R. K ERYELL 344 / 361

Extensions

Du C pour le graphisme

Extensions

Du C pour le graphisme

Le plan
1

CUDA
http://developer.nvidia.com
Modle mmoire & allocation Entres-sorties GNOME diteur exemple dEmacs Tuning de son clavier Compilation Modularisation Mise au point Dvermineur (debugger) Analyse mmoire Extensions Du C pour le graphisme C++ Dlires Le btisier Concours de programmes incomprhensibles Conclusion Index Table des matires

(I)

2 3

Introduction Bibliographie Petite histoire Langage Gnralits Un ordinateur ? Mais quest-ce ? Les bases de la numrologie Calcul binaire Dclarations Gnralits Types des objets Porte Expressions Smantique oprateurs Coercition de type Instructions Prprocesseur Bibliothques

Gros besoin de ralisme dans les jeux et applications multimdia Cartes graphiques de plus en plus performantes avec beaucoup de mmoire Domaine de recherche fun Besoin de dvelopper de nouvelles versions & application
En interne nVidia pour bibliothques et fonctionnalits
Rendu de cheveux/poils et coiffeur virtuel

9 10 11 12

http://www.joealter.com
Translucidit

13

En externe car vellits dexploiter cette puissance de calcul

14

Compilateur Environnement dexcution (runtime)


Mesures de performance

6 7 8

15 16 17

Pour Windows, Linux x86 32 & 64 bits, MacOS X Paralllisation sur 2 cartes avec SLI (Scalable Link Interface)
C avant C UV2 INF 446 TLCOM Bretagne/Info/HPCAS E E S. E VEN, S. G UELTON & R. K ERYELL 346 / 361

C avant C UV2 INF 446 TLCOM Bretagne/Info/HPCAS E E S. E VEN, S. G UELTON & R. K ERYELL 345 / 361

Extensions

Du C pour le graphisme

Extensions

C++

Nouveaux formats de donnes

(I)

Le plan
1

Beaucoup de mmoire, mais jamais assez Dbit importants entre CPU et GPU (PCI X16...) mais jamais assez Types plus petits adapts la taille de chaque problmes
Type half ottant : 10 bits de mantisse et 5 bits dexposant

Introduction Bibliographie Petite histoire Langage Gnralits Un ordinateur ? Mais quest-ce ? Les bases de la numrologie Calcul binaire Dclarations Gnralits Types des objets Porte Expressions Smantique oprateurs Coercition de type Instructions Prprocesseur Bibliothques

9 10 11 12

13

14

6 7 8
C avant C UV2 INF 446 TLCOM Bretagne/Info/HPCAS E E S. E VEN, S. G UELTON & R. K ERYELL 347 / 361

15 16 17

Modle mmoire & allocation Entres-sorties GNOME diteur exemple dEmacs Tuning de son clavier Compilation Modularisation Mise au point Dvermineur (debugger) Analyse mmoire Extensions Du C pour le graphisme C++ Dlires Le btisier Concours de programmes incomprhensibles Conclusion Index Table des matires

C avant C UV2 INF 446 TLCOM Bretagne/Info/HPCAS E E S. E VEN, S. G UELTON & R. K ERYELL 348 / 361

Extensions

C++

Dlires

C++
... en 1 transparent

Le plan
1

Langage orient objet bas sur C


Rajoute fonctions dans structures classes Polymorphisme Surcharge doprateurs du langage (+ - , () []...) Exceptions Patrons de types gnriques Espaces de nommages Grosse bibliothque standard (STL, Boost)

2 3

Encore bien plus subtil que le C... En attendant son apprentissage... groupe de musique C++ dont premier disque est Orient Objet http://www.oriente-objet.com/ , http://www.myspace.com/charlottecplusplus prochain concert gratuit 13/05/2009, 20h, LInternational, Paris

Introduction Bibliographie Petite histoire Langage Gnralits Un ordinateur ? Mais quest-ce ? Les bases de la numrologie Calcul binaire Dclarations Gnralits Types des objets Porte Expressions Smantique oprateurs Coercition de type Instructions Prprocesseur Bibliothques

9 10 11 12

13

14

6 7 8

15 16 17

Modle mmoire & allocation Entres-sorties GNOME diteur exemple dEmacs Tuning de son clavier Compilation Modularisation Mise au point Dvermineur (debugger) Analyse mmoire Extensions Du C pour le graphisme C++ Dlires Le btisier Concours de programmes incomprhensibles Conclusion Index Table des matires

C avant C UV2 INF 446 TLCOM Bretagne/Info/HPCAS E E S. E VEN, S. G UELTON & R. K ERYELL 349 / 361

C avant C UV2 INF 446 TLCOM Bretagne/Info/HPCAS E E S. E VEN, S. G UELTON & R. K ERYELL 350 / 361

Dlires

Le btisier

Dlires

Le btisier

Le plan
1

Loctal qui passe la trappe


Modle mmoire & allocation Entres-sorties GNOME diteur exemple dEmacs Tuning de son clavier Compilation Modularisation Mise au point Dvermineur (debugger) Analyse mmoire Extensions Du C pour le graphisme C++ Dlires Le btisier Concours de programmes incomprhensibles Conclusion Index Table des matires

(I)

2 3

Introduction Bibliographie Petite histoire Langage Gnralits Un ordinateur ? Mais quest-ce ? Les bases de la numrologie Calcul binaire Dclarations Gnralits Types des objets Porte Expressions Smantique oprateurs Coercition de type Instructions Prprocesseur Bibliothques

9 10 11 12

strcpy ( msg . mtext , " coucou " ); id = msgget (k , IPC_CREAT |660);

au lieu de
1 2

13

strncpy ( msg . mtext , " coucou " , s i z e o f ( msg . mtext )); id = msgget (k , IPC_CREAT |0660);

14

6 7 8

15 16 17

C avant C UV2 INF 446 TLCOM Bretagne/Info/HPCAS E E S. E VEN, S. G UELTON & R. K ERYELL 351 / 361

C avant C UV2 INF 446 TLCOM Bretagne/Info/HPCAS E E S. E VEN, S. G UELTON & R. K ERYELL 352 / 361

Dlires

Le btisier

Dlires

Concours de programmes incomprhensibles

Choses (ne pas) faire

(I)

Le plan
1

http://freeworld.thc.org/root/phun/unmaintain.html

2 3

How To Write Unmaintainable Code Ensure a job for life , Roedy G REEN, Canadian Mind Products An early version of this article appeared in Java Developers Journal (volume 2 issue 6). I also spoke on this topic in 1997 November at the Colorado Summit Conference. It has been gradually growing ever since.

Introduction Bibliographie Petite histoire Langage Gnralits Un ordinateur ? Mais quest-ce ? Les bases de la numrologie Calcul binaire Dclarations Gnralits Types des objets Porte Expressions Smantique oprateurs Coercition de type Instructions Prprocesseur Bibliothques

9 10 11 12

13

14

6 7 8
C avant C UV2 INF 446 TLCOM Bretagne/Info/HPCAS E E S. E VEN, S. G UELTON & R. K ERYELL 353 / 361

15 16 17

Modle mmoire & allocation Entres-sorties GNOME diteur exemple dEmacs Tuning de son clavier Compilation Modularisation Mise au point Dvermineur (debugger) Analyse mmoire Extensions Du C pour le graphisme C++ Dlires Le btisier Concours de programmes incomprhensibles Conclusion Index Table des matires

C avant C UV2 INF 446 TLCOM Bretagne/Info/HPCAS E E S. E VEN, S. G UELTON & R. K ERYELL 354 / 361

Dlires

Concours de programmes incomprhensibles

Dlires

Concours de programmes incomprhensibles

Quimprime-ce ?
Quizz

Concours

The International Obfuscated C Code Contest


1 2

main (){ printf (& unix [ "\021% s i x \012\0 " ] , ( unix )[ " have " ]+ " f u n " -0 x60 );}

unix est une variable faiblement dnie valant 1 &unix["\021%six\012\0"] &(*(unix+"\021%six\012\0"]))


"%six\012\0"

(unix)["have"]+"fun"-0x60 "have"[1]+"fun"-0x60 "fun"+(a-0x60) "fun"+1 "un"

http ://www.de.ioccc.org/years.html Un programme de gnration de dessins stroscopiques dont le source est un... dessin stroscopique http ://www.de.ioccc.org/2001/herrmann2.c Posie sur relation amoureuse http ://www.ioccc.org/1990/westley.c Simulateur de vol en forme davion http ://www.ioccc.org/1998/banks.c

Concours sur le thme du bug

http ://worsethanfailure.com/Articles/The-Worse-Than-Failure-Programming-C

C avant C UV2 INF 446 TLCOM Bretagne/Info/HPCAS E E S. E VEN, S. G UELTON & R. K ERYELL 355 / 361

C avant C UV2 INF 446 TLCOM Bretagne/Info/HPCAS E E S. E VEN, S. G UELTON & R. K ERYELL 356 / 361

Dlires

Concours de programmes incomprhensibles

Conclusion

Retour aux sources de linformatique

(I)

Le plan
1

Vous avez dsormais des connaissances sufsantes pour :


http://computing-dictionary.thefreedictionary.com/Use+the+Source+Luke

Introduction Bibliographie Petite histoire Langage Gnralits Un ordinateur ? Mais quest-ce ? Les bases de la numrologie Calcul binaire Dclarations Gnralits Types des objets Porte Expressions Smantique oprateurs Coercition de type Instructions Prprocesseur Bibliothques

9 10 11 12

13

14

6 7 8
C avant C UV2 INF 446 TLCOM Bretagne/Info/HPCAS E E S. E VEN, S. G UELTON & R. K ERYELL 357 / 361

15 16 17

Modle mmoire & allocation Entres-sorties GNOME diteur exemple dEmacs Tuning de son clavier Compilation Modularisation Mise au point Dvermineur (debugger) Analyse mmoire Extensions Du C pour le graphisme C++ Dlires Le btisier Concours de programmes incomprhensibles Conclusion Index Table des matires

C avant C UV2 INF 446 TLCOM Bretagne/Info/HPCAS E E S. E VEN, S. G UELTON & R. K ERYELL 358 / 361

Conclusion

Index

Conclusion

(I)

Le plan
1

Langage puissant & spectre large horizontalement et verticalement Langage trs (trop ?) subtil Dclarations compliques Arithmtique binaire puissante pour optimiser et niveau matriel/lectronique Pointeurs & allocation mmoire subtiles Sert de base de nombreux autres langages Il faut pratiquer !

2 3

Suite : programmation systme et rseau en 3A SLR/IT & Module IAHP du Master Recherche

Introduction Bibliographie Petite histoire Langage Gnralits Un ordinateur ? Mais quest-ce ? Les bases de la numrologie Calcul binaire Dclarations Gnralits Types des objets Porte Expressions Smantique oprateurs Coercition de type Instructions Prprocesseur Bibliothques

9 10 11 12

13

14

6 7 8

15 16 17

Modle mmoire & allocation Entres-sorties GNOME diteur exemple dEmacs Tuning de son clavier Compilation Modularisation Mise au point Dvermineur (debugger) Analyse mmoire Extensions Du C pour le graphisme C++ Dlires Le btisier Concours de programmes incomprhensibles Conclusion Index Table des matires

C avant C UV2 INF 446 TLCOM Bretagne/Info/HPCAS E E S. E VEN, S. G UELTON & R. K ERYELL 359 / 361

C avant C UV2 INF 446 TLCOM Bretagne/Info/HPCAS E E S. E VEN, S. G UELTON & R. K ERYELL 360 / 361

Index #define dnition prprocesseur, 253 macroconstante prprocesseur, 253 macrofonction prprocesseur, 253 prprocesseur dnition, 253 macroconstante, 253 macrofonction, 253 #define constante prprocesseur, 109, 165 prprocesseur constante, 109, 165 #if compilation conditionnelle prprocesseur, 257 prprocesseur compilation conditionnelle, 257 #include inclusionchier prprocesseur, 249 prprocesseur inclusionchier, 249 & et logique oprateur, 205 adresse dun objet oprateur, 229 oprateur et logique, 205 adresse dun objet, 229 && et logique boolen oprateur, 217 oprateur et logique boolen, 217 C avant C UV2 INF 446 TLCOM Bretagne/Info/HPCAS E E || ou logique boolen oprateur, 217 oprateur ou logique boolen, 217 () appel fonction oprateur, 201 oprateur appel fonction, 201 * drfrencement de pointeur oprateur, 229 multiplication oprateur, 205 oprateur drfrencement de pointeur, 229 multiplication, 205 + addition oprateur, 205 oprateur addition, 205 ++ incrmentation opration, 221 opration incrmentation, 221 , liste dexpressions oprateur, 233 oprateur liste dexpressions, 233 ngation oprateur, 77 oprateur ngation, 77 -> drfrencement de champ oprateur, 197 oprateur drfrencement de champ, 197 . champ oprateur, 197 oprateur champ, 197 / division oprateur, 205 oprateur division, 205 < infrieur oprateur, 217 oprateur infrieur, 217 << dcalage gauche oprateur, 205 oprateur dcalage gauche, 205 <= infrieur ou gal S. E VEN, S. G UELTON & R. K ERYELL -dcrmentation opration, 221 opration dcrmentation, 221 ngation oprateur, 205 oprateur ngation, 205 soustraction, 205 soustraction oprateur, 205

Index oprateur, 217 oprateur infrieur ou gal, 217 = affectation oprateur, 45 oprateur affectation, 45 != oprateur test de diffrence, 217 test de diffrence oprateur, 217 == oprateur test dgalit, 217 test dgalit oprateur, 217 > oprateur suprieur, 217 suprieur oprateur, 217 >= oprateur suprieur ou gal, 217 suprieur ou gal oprateur, 217 >> dcalage droite oprateur, 205 oprateur dcalage droite, 205 ? : expression conditionnelle oprateur, 221 oprateur expression conditionnelle, 221 [] C avant C UV2 INF 446 % modulo entier oprateur, 205 oprateur modulo entier, 205 et logique & oprateur, 205 oprateur &, 205 ou logique exclusif ^ oprateur, 205 oprateur ^, 205 et logique boolen && oprateur, 217 oprateur &&, 217 ou logique boolen || oprateur, 217 oprateur ||, 217 ^ ou logique exclusif oprateur, 205 oprateur ou logique exclusif, 205 ! ngation logique oprateur, 217 oprateur ngation logique, 217 ~ indice oprateur, 197 oprateur indice, 197 complment restreint oprateur, 205 complment restreint oprateur, 77 ngation oprateur, 205, 217 oprateur complment restreint, 205 complment restreint, 77 ngation, 205, 217 16 bits caractre codage, 73 codage caractre, 73 entier int16_t, 105 uint16_t, 105 int16_t entier, 105 uint16_t entier, 105 32 bits entier int32_t, 105 uint32_t, 105 int32_t entier, 105 uint32_t entier, 105 64 bits entier int64_t, 105 uint64_t, 105 int64_t entier, 105 uint64_t entier, 105 8 bits entier

360 / 361

TLCOM Bretagne/Info/HPCAS E E

S. E VEN, S. G UELTON & R. K ERYELL

360 / 361

Index int8_t, 105 uint8_t, 105 int8_t entier, 105 uint8_t entier, 105 addition + oprateur, 205 oprateur +, 205 adresse dun objet & oprateur, 229 oprateur &, 229 affectation = oprateur, 45 arithmtique opration, 221 effet de bord opration, 221 oprateur =, 45 opration arithmtique, 221 effet de bord, 221 variable, 45 afchage chane de caractres puts()puts(), 277 puts()puts() chane de caractres, 277 agrgat expression lmentaire, 189 lmentaire expression, 189 C avant C UV2 INF 446 TLCOM Bretagne/Info/HPCAS E E agrg type, 81 aiguillage break instruction, 241, 245 case instruction, 241 default instruction, 241 instruction break, 241, 245 case, 241 default, 241 switch(), 241 switch() instruction, 241 alias attribut restrict, 85, 169 restrict attribut, 85, 169 aliasing mmoire pointeur, 165, 169 pointeur mmoire, 165, 169 allocation calloc() mmoire, 269 dynamique mmoire, 269 malloc() mmoire, 269 malloc(int size) mmoire, 165 matrice taille variable, 201 mmoire calloc(), 269 dynamique, 269 malloc(), 269 malloc(int size), 165 pointeur type, 129 taille variable matrice, 201 type pointeur, 129 appel fonction () oprateur, 201 oprateur (), 201 arithmtique affectation opration, 221 binaire multispin-coding, 209 optimisation, 209 oprateur, 205 xe virgule, 117 ottant non associativit, 117 somme, 117 type, 85, 113, 117 intgral type, 85 multispin-coding binaire, 209 non associativit ottant, 117 optimisation binaire, 209 oprateur binaire, 205 opration affectation, 221 pointeur type, 233

Index rel type, 117 somme ottant, 117 type, 81 ottant, 85, 113, 117 intgral, 85 pointeur, 233 rel, 117 virgule xe, 117 ASCII caractre codage, 93 codage caractre, 93 assembleur, 37 associativit oprateur priorit, 193 priorit oprateur, 193 attribut alias restrict, 85, 169 auto rangement, 85, 161 const constante, 85, 165 constante const, 85, 165 entier long, 101 long long, 101 short, 101 signed, 101 unsigned, 101 long entier, 101 long long C avant C UV2 INF 446 entier, 101 rangement auto, 85, 161 register, 85, 161 static, 85 register rangement, 85, 161 restrict alias, 85, 169 short entier, 101 signed entier, 101 static rangement, 85 unsigned entier, 101 volatile volatilit, 85, 161, 165 volatilit volatile, 85, 161, 165 auto attribut rangement, 85, 161 rangement attribut, 85, 161 base 8 nombre reprsentation, 69 reprsentation nombre, 69 base 16 nombre reprsentation, 69 reprsentation nombre, 69 base 2 nombre reprsentation, 65 reprsentation nombre, 65 base 2048 nombre reprsentation, 73 reprsentation nombre, 73 base 256 nombre reprsentation, 73 reprsentation nombre, 73 base 65536 nombre reprsentation, 73 reprsentation nombre, 73 baud nombre reprsentation, 65 reprsentation nombre, 65 bibliothque libc, 13 standard, 261 binaire arithmtique multispin-coding, 209 optimisation, 209 oprateur, 205 constante expression, 185 expression constante, 185 logique oprateur, 217 multispin-coding arithmtique, 209 nombre reprsentation, 65

S. E VEN, S. G UELTON & R. K ERYELL

360 / 361

TLCOM Bretagne/Info/HPCAS E E

S. E VEN, S. G UELTON & R. K ERYELL

360 / 361

Index optimisation arithmtique, 209 oprateur arithmtique, 205 logique, 217 reprsentation nombre, 65 systme unit, 65 unit systme, 65 bit nombre reprsentation, 65 reprsentation nombre, 65 structure type, 145 type structure, 145 bool boolen entier, 109 entier boolen, 109 boolen bool entier, 109 entier bool, 109 intgral type, 85, 109 type intgral, 85, 109 boucle break instruction, 241, 245 continue instruction, 241, 245 do C avant C UV2 INF 446 TLCOM Bretagne/Info/HPCAS E E instruction, 49, 245 for instruction, 53, 245 instruction break, 241, 245 continue, 241, 245 do, 49, 245 for, 53, 245 while, 49, 241 while instruction, 49, 241 branchement goto instruction, 245 instruction goto, 245 break aiguillage instruction, 241, 245 boucle instruction, 241, 245 instruction aiguillage, 241, 245 boucle, 241, 245 C++ langage objet, 353 objet langage, 353 calloc() allocation mmoire, 269 mmoire allocation, 269 caractre 16 bits codage, 73 ASCII codage, 93

Index CHAR_BIT, 101 type , 101 chane, 133 intgral, 85, 89 large, 97, 109 vecteur, 133 UNICODE codage, 97 vecteur type, 133 wchar_t large, 109 case aiguillage instruction, 241 instruction aiguillage, 241 cast conversion explicite type, 229 type conversion explicite, 229 champ . oprateur, 197 oprateur ., 197 champ de bits structure type, 145 type structure, 145 valeur, 101 valeur limite, 101 CHAR_BIT caractre taille, 101 taille caractre, 101 chane caractre large, 137 type, 133 large caractre, 137 type caractre, 133 chane de caractres afchage puts()puts(), 277 puts()puts() afchage, 277 chane de caractres clonage strdup(), 273 longueur strlen(), 269 strdup() clonage, 273 strlen() longueur, 269 clavier conguration, 317 clonage chane de caractres strdup(), 273 strdup() chane de caractres, 273 codage 16 bits caractre, 73 ASCII caractre, 93 caractre 16 bits, 73 ASCII, 93 ISO-10646, 97 ISO-646, 93 ISO-8859-1, 97 ISO-8859-15, 97 latin-1, 97 latin-9, 97 UNICODE, 97 ISO-10646 caractre, 97 ISO-646 caractre, 93 ISO-8859-1 caractre, 97 ISO-8859-15 caractre, 97 latin-1 caractre, 97 latin-9 caractre, 97 UNICODE caractre, 97 coercition conversion explicite type, 229 type conversion explicite, 229 commentaires, 37 comparaison oprateur, 217 compilateur, 37 GCC, 325 gcc, 13 compilation, 321 make, 325 makele, 325

char
type, 101 CHAR_BIT taille, 101 chane large, 137 type, 133 codage 16 bits, 73 ASCII, 93 ISO-10646, 97 ISO-646, 93 ISO-8859-1, 97 ISO-8859-15, 97 latin-1, 97 latin-9, 97 UNICODE, 97 constante expression, 185 expression constante, 185 intgral type, 85, 89 ISO-10646 codage, 97 ISO-646 codage, 93 ISO-8859-1 codage, 97 ISO-8859-15 codage, 97 large chane, 137 type, 97, 109 wchar_t, 109 latin-1 codage, 97 latin-9 codage, 97 taille 360 / 361

char

char
caractre type, 101 type caractre, 101 char limite C avant C UV2 INF 446 TLCOM Bretagne/Info/HPCAS E E

S. E VEN, S. G UELTON & R. K ERYELL

S. E VEN, S. G UELTON & R. K ERYELL

360 / 361

Index compilation conditionnelle #if prprocesseur, 257 prprocesseur #if, 257 complexe constante expression, 185 double complex ottant, 125 expression constante, 185 float complex ottant, 125 ottant double complex, 125 float complex, 125 long double complex, 125 type, 85, 125 long double complex ottant, 125 type ottant, 85, 125 complment restreint ~ oprateur, 205 nombre ngatif, 205 ngatif nombre, 205 oprateur ~, 205 complment restreint ~ oprateur, 77 nombre ngatif, 77 ngatif nombre, 77 oprateur C avant C UV2 INF 446 TLCOM Bretagne/Info/HPCAS E E ~, 77 complment vrai nombre ngatif, 77 ngatif nombre, 77 complment 2 nombre ngatif, 77 ngatif nombre, 77 composition dclaration oprateurs, 153 oprateurs dclaration, 153 conguration clavier, 317 const attribut constante, 85, 165 constante attribut, 85, 165 constante #define prprocesseur, 109, 165 attribut const, 85, 165 binaire expression, 185 caractre expression, 185 complexe expression, 185 const attribut, 85, 165 dcimale expression, 185 entire expression, 185 expression binaire, 185 caractre, 185 complexe, 185 dcimale, 185 entire, 185 ottante, 185 hexadcimal, 185 octale, 185 ottante expression, 185 hexadcimal expression, 185 octale expression, 185 prprocesseur #define, 109, 165 construction expression, 189 continue boucle instruction, 241, 245 instruction boucle, 241, 245 contrle de ot, 49 conventions typographie, 25 conversion type, 193 conversion explicite coercition type, 229 type coercition, 229 conversion explicite cast type, 229 type cast, 229 court

Index entier short int, 101 short int entier, 101 DDD dbogueur, 341 default aiguillage instruction, 241 instruction aiguillage, 241 division / oprateur, 205 oprateur /, 205 do boucle instruction, 49, 245 instruction boucle, 49, 245 double double ottant, 113 ottant double, 113 double double ottant, 113 ottant double, 113 double complex complexe ottant, 125 ottant complexe, 125 dure de vie objet, 161 dynamique C avant C UV2 INF 446 allocation mmoire, 269 mmoire allocation, 269 dbogage dbogueur mise au point, 337 mise au point dbogueur, 337 dbogueur DDD, 341 dbogage mise au point, 337 GDB, 337 gdb, 13 mise au point dbogage, 337 dbut main() programme, 33, 37, 197 programme main(), 33, 37, 197 dcalage droite >> oprateur, 205 oprateur >>, 205 dcalage gauche << oprateur, 205 oprateur <<, 205 dcimale constante expression, 185 expression constante, 185 dclaration composition oprateurs, 153 initialisation variable, 45, 177 objet place, 161 oprateurs composition, 153 place objet, 161 porte, 157 variable, 45, 85 initialisation, 45, 177 dcrmentation -opration, 221 opration --, 221 dnition #define prprocesseur, 253 prprocesseur #define, 253 dnormalis ottant nombre, 121 nombre ottant, 121 drfrencement de pointeur * oprateur, 229 oprateur *, 229 drfrencement de champ -> oprateur, 197 oprateur ->, 197 dverminage mmoire, 341 Purify, 341 Valgrind, 341

S. E VEN, S. G UELTON & R. K ERYELL

360 / 361

TLCOM Bretagne/Info/HPCAS E E

S. E VEN, S. G UELTON & R. K ERYELL

360 / 361

Index Purify mmoire, 341 Valgrind mmoire, 341 effet de bord, 33 affectation opration, 221 opration affectation, 221 else instruction test, 49, 241 test instruction, 49, 241 Emacs texte diteur, 289 diteur texte, 289 emacs diteur de texte, 13 entier 16 bits int16_t, 105 uint16_t, 105 32 bits int32_t, 105 uint32_t, 105 64 bits int64_t, 105 uint64_t, 105 8 bits int8_t, 105 uint8_t, 105 attribut long, 101 long long, 101 short, 101 signed, 101 C avant C UV2 INF 446 TLCOM Bretagne/Info/HPCAS E E unsigned, 101 bool boolen, 109 boolen bool, 109 court short int, 101 enum numration, 109 int normal, 101 int16_t 16 bits, 105 int32_t 32 bits, 105 int64_t 64 bits, 105 int8_t 8 bits, 105 intgral type, 85, 101 large wint_t, 109 long long int, 101 long attribut, 101 long int long, 101 long long attribut, 101 long long int trs long, 101 nombre reprsentation, 61 non sign type, 101 normal int, 101 reprsentation nombre, 61 short attribut, 101 short int court, 101 signed attribut, 101 trs long long long int, 101 type intgral, 85, 101 non sign, 101 uint16_t 16 bits, 105 uint32_t 32 bits, 105 uint64_t 64 bits, 105 uint8_t 8 bits, 105 unsigned attribut, 101 wint_t large, 109 numration enum, 109 entire constante expression, 185 expression constante, 185 entre format scanf(), 281 scanf() format, 281 entre-sortie fclose( fermeture, 273 fermeture

Index fclose(, 273 fopen( ouverture, 273 ouverture fopen(, 273 stream, 273 enum entier numration, 109 numration entier, 109 expression, 29, 181 agrgat lmentaire, 189 binaire constante, 185 caractre constante, 185 complexe constante, 185 constante binaire, 185 caractre, 185 complexe, 185 dcimale, 185 entire, 185 ottante, 185 hexadcimal, 185 octale, 185 construction, 189 dcimale constante, 185 entire constante, 185 ottante constante, 185 hexadcimal constante, 185 L-valeur lmentaire, 189 C avant C UV2 INF 446 littrale lmentaire, 185 lvalue lmentaire, 189 octale constante, 185 symbolique lmentaire, 189 type, 173 lmentaire agrgat, 189 L-valeur, 189 littrale, 185 lvalue, 189 symbolique, 189 expression conditionnelle ? : oprateur, 221 oprateur ? :, 221 extension nombre prcision, 77 prcision nombre, 77 fclose( entre-sortie fermeture, 273 fermeture entre-sortie, 273 fermeture entre-sortie fclose(, 273 fclose( entre-sortie, 273 F IBONACCI, 157 xe arithmtique virgule, 117 virgule arithmtique, 117 float ottant petit, 113 petit ottant, 113 float complex complexe ottant, 125 ottant complexe, 125 ottant arithmtique non associativit, 117 somme, 117 type, 85, 113, 117 complexe double complex, 125 float complex, 125 long double complex, 125 type, 85, 125 double double, 113 double double, 113 double complex complexe, 125 dnormalis nombre, 121 float petit, 113 float complex complexe, 125 long double tendu, 113 long double complex complexe, 125 nombre dnormalis, 121

S. E VEN, S. G UELTON & R. K ERYELL

360 / 361

TLCOM Bretagne/Info/HPCAS E E

S. E VEN, S. G UELTON & R. K ERYELL

360 / 361

Index normalis, 121 non associativit arithmtique, 117 normalis nombre, 121 petit float, 113 rel type, 85, 113 somme arithmtique, 117 type arithmtique, 85, 113, 117 complexe, 85, 125 rel, 85, 113 tendu long double, 113 ottante constante expression, 185 expression constante, 185 fonction, 29, 329 incomplet type, 149 paramtre, 49 type, 81, 149 incomplet, 149 fopen( entre-sortie ouverture, 273 ouverture entre-sortie, 273 for boucle instruction, 53, 245 instruction boucle, 53, 245 format entre C avant C UV2 INF 446 TLCOM Bretagne/Info/HPCAS E E scanf(), 281 fprintf sortie, 277 scanf() entre, 281 sortie fprintf, 277 free() libration mmoire, 269 mmoire libration, 269 GCC compilateur, 325 gcc compilateur, 13 GDB dbogueur, 337 gdb dbogueur, 13 gettimeofday, 41 globale variable, 45 GNU systme dexploitation, 25 goto branchement instruction, 245 instruction branchement, 245 hexadcimal constante expression, 185 expression constante, 185 nombre reprsentation, 69 if instruction test, 49, 241 test instruction, 49, 241 inclusionchier #include prprocesseur, 249 prprocesseur #include, 249 incomplet fonction type, 149 pointeur type, 149 structure type, 149 type, 149 fonction, 149 pointeur, 149 structure, 149 incomplets type, 81 incomplte initialisation variable, 177 variable initialisation, 177 incrmentation ++ opration, 221 opration reprsentation nombre, 69 identicateur nom objet, 85 objet nom, 85

Index ++, 221 indentation programme prsentation, 57 prsentation programme, 57 indice [] oprateur, 197 oprateur [], 197 inxe oprateur, 189 infrieur < oprateur, 217 oprateur <, 217 infrieur ou gal <= oprateur, 217 oprateur <=, 217 initialisation dclaration variable, 45, 177 incomplte variable, 177 variable dclaration, 45, 177 incomplte, 177 inline, 41 instruction, 29, 237 aiguillage break, 241, 245 case, 241 default, 241 switch(), 241 boucle break, 241, 245 C avant C UV2 INF 446 continue, 241, 245 do, 49, 245 for, 53, 245 while, 49, 241 branchement goto, 245 break aiguillage, 241, 245 boucle, 241, 245 case aiguillage, 241 continue boucle, 241, 245 default aiguillage, 241 do boucle, 49, 245 else test, 49, 241 for boucle, 53, 245 goto branchement, 245 if test, 49, 241 programme prsentation, 53 prsentation programme, 53 retour de fonction return, 245 return retour de fonction, 245 saut, 245 switch() aiguillage, 241 test else, 49, 241 if, 49, 241 while boucle, 49, 241 int entier normal, 101 limite valeur, 101 normal entier, 101 valeur limite, 101 int16_t 16 bits entier, 105 entier 16 bits, 105 int32_t 32 bits entier, 105 entier 32 bits, 105 int64_t 64 bits entier, 105 entier 64 bits, 105 int8_t 8 bits entier, 105 entier 8 bits, 105 intgral arithmtique type, 85 boolen type, 85, 109 caractre type, 85, 89 entier type, 85, 101 type

S. E VEN, S. G UELTON & R. K ERYELL

360 / 361

TLCOM Bretagne/Info/HPCAS E E

S. E VEN, S. G UELTON & R. K ERYELL

360 / 361

Index arithmtique, 85 boolen, 85, 109 caractre, 85, 89 entier, 85, 101 numration, 85, 109 numration type, 85, 109 ISO-10646 caractre codage, 97 codage caractre, 97 ISO-646 caractre codage, 93 codage caractre, 93 ISO-8859-1 caractre codage, 97 codage caractre, 97 ISO-8859-15 caractre codage, 97 codage caractre, 97 L-valeur expression lmentaire, 189 lmentaire expression, 189 langage C++ objet, 353 objet C++, 353 large caractre C avant C UV2 INF 446 TLCOM Bretagne/Info/HPCAS E E chane, 137 type, 97, 109 wchar_t, 109 chane caractre, 137 entier wint_t, 109 type caractre, 97, 109 wchar_t caractre, 109 wint_t entier, 109 latin-1 caractre codage, 97 codage caractre, 97 latin-9 caractre codage, 97 codage caractre, 97 libc bibliothque, 13 libration free() mmoire, 269 mmoire free(), 269 limite char valeur, 101 int valeur, 101 long int valeur, 101 long long int valeur, 101 short int valeur, 101 valeur char, 101 int, 101 long int, 101 long long int, 101 short int, 101 linarisation type vecteur, 129 vecteur type, 129 liste dexpressions , oprateur, 233 oprateur ,, 233 littrale expression lmentaire, 185 lmentaire expression, 185 locale variable, 45 logique binaire oprateur, 217 oprateur binaire, 217 long entier long int, 101 long int entier, 101 long attribut entier, 101 entier attribut, 101 long int

Index entier long, 101 long entier, 101 long double ottant tendu, 113 tendu ottant, 113 long double complex complexe ottant, 125 ottant complexe, 125 long int limite valeur, 101 valeur limite, 101 long long attribut entier, 101 entier attribut, 101 long long int entier trs long, 101 limite valeur, 101 trs long entier, 101 valeur limite, 101 longjmp() saut non local, 281 longueur chane de caractres strlen(), 269 strlen() chane de caractres, 269 C avant C UV2 INF 446 lvalue expression lmentaire, 189 lmentaire expression, 189 macroconstante #define prprocesseur, 253 prprocesseur #define, 253 macrofonction #define prprocesseur, 253 prprocesseur #define, 253 main() dbut programme, 33, 37, 197 programme dbut, 33, 37, 197 make, 13 compilation, 325 make, 37 Makefile, 37 makele compilation, 325 malloc() allocation mmoire, 269 mmoire allocation, 269 malloc(int size) allocation mmoire, 165 mmoire allocation, 165 matrice allocation taille variable, 201 taille variable allocation, 201 mise au point dbogage dbogueur, 337 dbogueur dbogage, 337 modulo entier % oprateur, 205 oprateur %, 205 modle mmoire, 265 mommage type typedef, 173 typedef type, 173 mots-cls, 89 MULTICS systme dexploitation, 17 multiplication * oprateur, 205 oprateur *, 205 multispin-coding arithmtique binaire, 209 binaire arithmtique, 209 mmoire aliasing pointeur, 165, 169 allocation calloc(), 269 dynamique, 269 malloc(), 269 malloc(int size), 165

S. E VEN, S. G UELTON & R. K ERYELL

360 / 361

TLCOM Bretagne/Info/HPCAS E E

S. E VEN, S. G UELTON & R. K ERYELL

360 / 361

Index calloc() allocation, 269 dynamique allocation, 269 dverminage, 341 Purify, 341 Valgrind, 341 free() libration, 269 libration free(), 269 malloc() allocation, 269 malloc(int size) allocation, 165 modle, 265 pointeur aliasing, 165, 169 Purify dverminage, 341 Valgrind dverminage, 341 nom identicateur objet, 85 objet identicateur, 85 nombre base 8 reprsentation, 69 base 16 reprsentation, 69 base 2 reprsentation, 65 base 2048 reprsentation, 73 base 256 reprsentation, 73 base 65536 C avant C UV2 INF 446 TLCOM Bretagne/Info/HPCAS E E reprsentation, 73 baud reprsentation, 65 binaire reprsentation, 65 bit reprsentation, 65 complment restreint ngatif, 205 complment restreint ngatif, 77 complment vrai ngatif, 77 complment 2 ngatif, 77 dnormalis ottant, 121 entier reprsentation, 61 extension prcision, 77 ottant dnormalis, 121 normalis, 121 hexadcimal reprsentation, 69 normalis ottant, 121 ngatif complment restreint, 205 complment restreint, 77 complment vrai, 77 complment 2, 77 reprsentation, 77 signe, 77 octal reprsentation, 69 prcision extension, 77 reprsentation base 8, 69 base 16, 69 base 2, 65 base 2048, 73 base 256, 73 base 65536, 73 baud, 65 binaire, 65 bit, 65 entier, 61 hexadcimal, 69 ngatif, 77 octal, 69 signe ngatif, 77 non associativit arithmtique ottant, 117 ottant arithmtique, 117 non nie structure type, 141 type structure, 141 non sign entier type, 101 type entier, 101 normal entier int, 101 int entier, 101 normalis ottant nombre, 121 nombre ottant, 121

Index ngatif complment restreint nombre, 205 complment restreint nombre, 77 complment vrai nombre, 77 complment 2 nombre, 77 nombre complment restreint, 205 complment restreint, 77 complment vrai, 77 complment 2, 77 reprsentation, 77 signe, 77 reprsentation nombre, 77 signe nombre, 77 ngation oprateur, 77 oprateur, 205 ~ oprateur, 205, 217 oprateur -, 77 -, 205 ~, 205, 217 ngation logique ! oprateur, 217 oprateur !, 217 objet, 81 C++ langage, 353 C avant C UV2 INF 446 dure de vie, 161 dclaration place, 161 identicateur nom, 85 langage C++, 353 nom identicateur, 85 place dclaration, 161 octal nombre reprsentation, 69 reprsentation nombre, 69 octale constante expression, 185 expression constante, 185 octet, 81 ompilation, 37 optimisation arithmtique binaire, 209 binaire arithmtique, 209 oprateur & et logique, 205 adresse dun objet, 229 && et logique boolen, 217 || ou logique boolen, 217 () appel fonction, 201 * drfrencement de pointeur, 229 multiplication, 205 + addition, 205 , liste dexpressions, 233 ngation, 77 ngation, 205 soustraction, 205 -> drfrencement de champ, 197 . champ, 197 / division, 205 < infrieur, 217 << dcalage gauche, 205 <= infrieur ou gal, 217 = affectation, 45 != test de diffrence, 217 == test dgalit, 217 > suprieur, 217 >= suprieur ou gal, 217 >> dcalage droite, 205 ? : expression conditionnelle, 221

S. E VEN, S. G UELTON & R. K ERYELL

360 / 361

TLCOM Bretagne/Info/HPCAS E E

S. E VEN, S. G UELTON & R. K ERYELL

360 / 361

Index [] indice, 197 % modulo entier, 205 et logique &, 205 ou logique exclusif ^, 205 et logique boolen &&, 217 ou logique boolen ||, 217 ^ ou logique exclusif, 205 ! ngation logique, 217 ~ complment restreint, 205 complment restreint, 77 ngation, 205, 217 addition +, 205 adresse dun objet &, 229 affectation =, 45 appel fonction (), 201 arithmtique binaire, 205 associativit priorit, 193 binaire arithmtique, 205 logique, 217 champ ., 197 comparaison, 217 complment restreint ~, 205 C avant C UV2 INF 446 TLCOM Bretagne/Info/HPCAS E E complment restreint ~, 77 division /, 205 dcalage droite >>, 205 dcalage gauche <<, 205 drfrencement de pointeur *, 229 drfrencement de champ ->, 197 expression conditionnelle ? :, 221 indice [], 197 inxe, 189 infrieur <, 217 infrieur ou gal <=, 217 liste dexpressions ,, 233 logique binaire, 217 modulo entier %, 205 multiplication *, 205 ngation -, 77 -, 205 ~, 205, 217 ngation logique !, 217 postxe, 189 priorit, 193 associativit, 193 prxe, 189 sizeof() taille objet, 225 soustraction -, 205 suprieur >, 217 suprieur ou gal >=, 217 taille objet sizeof(), 225 test dgalit ==, 217 test de diffrence !=, 217 oprateurs composition dclaration, 153 dclaration composition, 153 opration ++ incrmentation, 221 -dcrmentation, 221 affectation arithmtique, 221 effet de bord, 221 arithmtique affectation, 221 dcrmentation --, 221 effet de bord affectation, 221 incrmentation ++, 221 ouverture entre-sortie fopen(, 273 fopen( entre-sortie, 273

Index paramtre fonction, 49 passage en paramtre type vecteur, 133 vecteur type, 133 petit float ottant, 113 ottant float, 113 place dclaration objet, 161 objet dclaration, 161 pointeur aliasing mmoire, 165, 169 allocation type, 129 arithmtique type, 233 incomplet type, 149 mmoire aliasing, 165, 169 type, 81, 125 allocation, 129 arithmtique, 233 incomplet, 149 void, 149 void type, 149 porte dclaration, 157 POSIX systme dexploitation, 25 postxe C avant C UV2 INF 446 oprateur, 189 fprintf format sortie, 277 sortie format, 277 priorit associativit oprateur, 193 oprateur, 193 associativit, 193 procdure, 29 programme, 33 dbut main(), 33, 37, 197 indentation prsentation, 57 instruction prsentation, 53 main() dbut, 33, 37, 197 prsentation indentation, 57 instruction, 53 prcision extension nombre, 77 nombre extension, 77 prxe oprateur, 189 prprocesseur, 37, 249 #define dnition, 253 macroconstante, 253 macrofonction, 253 #define constante, 109, 165 #if compilation conditionnelle, 257 #include inclusionchier, 249 compilation conditionnelle #if, 257 constante #define, 109, 165 dnition #define, 253 inclusionchier #include, 249 macroconstante #define, 253 macrofonction #define, 253 prsentation indentation programme, 57 instruction programme, 53 programme indentation, 57 instruction, 53 Purify, 341 dverminage mmoire, 341 mmoire dverminage, 341 puts()puts() afchage chane de caractres, 277 chane de caractres afchage, 277 rangement attribut auto, 85, 161 register, 85, 161 static, 85

S. E VEN, S. G UELTON & R. K ERYELL

360 / 361

TLCOM Bretagne/Info/HPCAS E E

S. E VEN, S. G UELTON & R. K ERYELL

360 / 361

Index auto attribut, 85, 161 register attribut, 85, 161 static attribut, 85 register attribut rangement, 85, 161 rangement attribut, 85, 161 reprsentation base 8 nombre, 69 base 16 nombre, 69 base 2 nombre, 65 base 2048 nombre, 73 base 256 nombre, 73 base 65536 nombre, 73 baud nombre, 65 binaire nombre, 65 bit nombre, 65 entier nombre, 61 hexadcimal nombre, 69 nombre base 8, 69 base 16, 69 base 2, 65 base 2048, 73 base 256, 73 C avant C UV2 INF 446 TLCOM Bretagne/Info/HPCAS E E base 65536, 73 baud, 65 binaire, 65 bit, 65 entier, 61 hexadcimal, 69 ngatif, 77 octal, 69 ngatif nombre, 77 octal nombre, 69 restrict alias attribut, 85, 169 attribut alias, 85, 169 retour de fonction instruction return, 245 return instruction, 245 return instruction retour de fonction, 245 retour de fonction instruction, 245 rcursion, 157 rcursivit, 157 rel arithmtique type, 117 ottant type, 85, 113 type arithmtique, 117 ottant, 85, 113 saut instruction, 245 saut non local longjmp(), 281 setjmp(), 281 scalaire type, 81 scanf() entre format, 281 format entre, 281 scope variable, 45 setjmp() saut non local, 281 short attribut entier, 101 entier attribut, 101 short int court entier, 101 entier court, 101 short int limite valeur, 101 valeur limite, 101 signe nombre ngatif, 77 ngatif nombre, 77 signed attribut entier, 101 entier attribut, 101 sizeof()

Index oprateur taille objet, 225 taille objet oprateur, 225 somme arithmtique ottant, 117 ottant arithmtique, 117 sortie format fprintf, 277 fprintf format, 277 sous-routine, 29 soustraction oprateur, 205 oprateur -, 205 standard bibliothque, 261 type, 145 static attribut rangement, 85 rangement attribut, 85 strdup() chane de caractres clonage, 273 clonage chane de caractres, 273 stream entre-sortie, 273 strlen() chane de caractres longueur, 269 longueur chane de caractres, 269 C avant C UV2 INF 446 structure bit type, 145 champ de bits type, 145 incomplet type, 149 non nie type, 141 type, 81, 137 bit, 145 champ de bits, 145 incomplet, 149 non nie, 141 suprieur > oprateur, 217 oprateur >, 217 suprieur ou gal >= oprateur, 217 oprateur >=, 217 switch() aiguillage instruction, 241 instruction aiguillage, 241 symbolique expression lmentaire, 189 lmentaire expression, 189 systme binaire unit, 65 unit binaire, 65 systme dexploitation GNU, 25 MULTICS, 17 POSIX, 25 UNIX, 17 tabulation, 57 taille caractre CHAR_BIT, 101 CHAR_BIT caractre, 101 taille objet oprateur sizeof(), 225 sizeof() oprateur, 225 taille variable type vecteur, 133 vecteur type, 133 taille variable allocation matrice, 201 matrice allocation, 201 test else instruction, 49, 241 if instruction, 49, 241 instruction else, 49, 241 if, 49, 241 test dgalit == oprateur, 217 oprateur ==, 217 test de diffrence

S. E VEN, S. G UELTON & R. K ERYELL

360 / 361

TLCOM Bretagne/Info/HPCAS E E

S. E VEN, S. G UELTON & R. K ERYELL

360 / 361

Index != oprateur, 217 oprateur !=, 217 texte Emacs diteur, 289 diteur, 289 Emacs, 289 timer, 41 trs long entier long long int, 101 long long int entier, 101 type agrg, 81 allocation pointeur, 129 arithmtique, 81 ottant, 85, 113, 117 intgral, 85 pointeur, 233 rel, 117 bit structure, 145 boolen intgral, 85, 109 caractre , 101 chane, 133 intgral, 85, 89 large, 97, 109 vecteur, 133 cast conversion explicite, 229 champ de bits structure, 145 chane caractre, 133 coercition conversion explicite, 229 complexe ottant, 85, 125 conversion, 193 conversion explicite coercition, 229 conversion explicite cast, 229 entier intgral, 85, 101 non sign, 101 expression, 173 ottant arithmtique, 85, 113, 117 complexe, 85, 125 rel, 85, 113 fonction, 81, 149 incomplet, 149 incomplet, 149 fonction, 149 pointeur, 149 structure, 149 incomplets, 81 intgral arithmtique, 85 boolen, 85, 109 caractre, 85, 89 entier, 85, 101 numration, 85, 109 large caractre, 97, 109 linarisation vecteur, 129 mommage typedef, 173 non nie structure, 141 non sign entier, 101 passage en paramtre vecteur, 133 pointeur, 81, 125 allocation, 129 arithmtique, 233 incomplet, 149 void, 149 rel arithmtique, 117 ottant, 85, 113 scalaire, 81 standard, 145 structure, 81, 137 bit, 145 champ de bits, 145 incomplet, 149 non nie, 141 taille variable vecteur, 133 typedef mommage, 173 union, 81, 141 vecteur, 81, 129 caractre, 133 linarisation, 129 passage en paramtre, 133 taille variable, 133 void pointeur, 149 numration intgral, 85, 109 typedef mommage type, 173 type mommage, 173 typographie conventions, 25

Index uint16_t 16 bits entier, 105 entier 16 bits, 105 uint32_t 32 bits entier, 105 entier 32 bits, 105 uint64_t 64 bits entier, 105 entier 64 bits, 105 uint8_t 8 bits entier, 105 entier 8 bits, 105 UNICODE caractre codage, 97 codage caractre, 97 union type, 81, 141 unit binaire systme, 65 systme binaire, 65 UNIX systme dexploitation, 17 unsigned attribut entier, 101 entier attribut, 101 C avant C UV2 INF 446 valeur char limite, 101 int limite, 101 limite char, 101 int, 101 long int, 101 long long int, 101 short int, 101 long int limite, 101 long long int limite, 101 short int limite, 101 Valgrind dverminage mmoire, 341 mmoire dverminage, 341 variable affectation, 45 dclaration, 45, 85 initialisation, 45, 177 globale, 45 incomplte initialisation, 177 initialisation dclaration, 45, 177 incomplte, 177 locale, 45 scope, 45 visibilit, 45 vecteur caractre type, 133 linarisation type, 129 passage en paramtre type, 133 taille variable type, 133 type, 81, 129 caractre, 133 linarisation, 129 passage en paramtre, 133 taille variable, 133 virgule arithmtique xe, 117 xe arithmtique, 117 visibilit variable, 45 void pointeur type, 149 type pointeur, 149 volatile attribut volatilit, 85, 161, 165 volatilit attribut, 85, 161, 165 volatilit attribut volatile, 85, 161, 165 volatile attribut, 85, 161, 165 vous tes ici, 363 wchar_t caractre large, 109 large caractre, 109 while boucle S. E VEN, S. G UELTON & R. K ERYELL

char

char
caractre, 101 C avant C UV2 INF 446 TLCOM Bretagne/Info/HPCAS E E

S. E VEN, S. G UELTON & R. K ERYELL

360 / 361

TLCOM Bretagne/Info/HPCAS E E

360 / 361

Index instruction, 49, 241 instruction boucle, 49, 241 wint_t entier large, 109 large entier, 109 diteur Emacs texte, 289 texte, 289 Emacs, 289 diteur de texte emacs, 13 diteur de lien, 37 dition de lien, 37 lmentaire agrgat expression, 189 expression agrgat, 189 L-valeur, 189 littrale, 185 lvalue, 189 symbolique, 189 L-valeur expression, 189 littrale expression, 185 lvalue expression, 189 symbolique expression, 189 numration entier enum, 109 enum entier, 109 intgral type, 85, 109 type intgral, 85, 109 tendu ottant long double, 113 long double ottant, 113

Table des matires

Le plan
1

2 3

Introduction Bibliographie Petite histoire Langage Gnralits Un ordinateur ? Mais quest-ce ? Les bases de la numrologie Calcul binaire Dclarations Gnralits Types des objets Porte Expressions Smantique oprateurs Coercition de type Instructions Prprocesseur Bibliothques

9 10 11 12

13

14

6 7 8
C avant C UV2 INF 446 TLCOM Bretagne/Info/HPCAS E E S. E VEN, S. G UELTON & R. K ERYELL 360 / 361

15 16 17

Modle mmoire & allocation Entres-sorties GNOME diteur exemple dEmacs Tuning de son clavier Compilation Modularisation Mise au point Dvermineur (debugger) Analyse mmoire Extensions Du C pour le graphisme C++ Dlires Le btisier Concours de programmes incomprhensibles Conclusion Index Table des matires

C avant C UV2 INF 446 TLCOM Bretagne/Info/HPCAS E E S. E VEN, S. G UELTON & R. K ERYELL 361 / 361

Table des matires Rgle de base Indentation 2 3 4 6 7 8 9 10 13 14 15 16 23 52 53

Table des matires Types entiers tendus de taille connue Caractres larges Boolens numrations Nombres ottants Conversion ottantsentiers larrache Nombres ottants = rels ! Algorithme de sommation de ottants Vers des nombres ottants normaliss Pourquoi des nombres ottants dnormaliss ? Dnormalisation ottante Nombres complexes Pointeurs Vecteurs Vecteur en paramtre de fonction Chane de caractres Chanes de caractres larges Structures de donnes Type dunion de types Champs de bits Autres types standards Types de fonctions Types incomplets FAQ Composition oprateurs de dclaration Porte Le plan Porte des dclarations O dclarer les variables Vie relle des objets Objets non modiables Des pointeurs problmes... Exemple de C : pointeurs Exemple de C : aliasing Pointeurs restreint Nommage de type Expression de type Initialisations de variables Initialisations avec types compliqus Variables temporaires C avant C UV2 INF 446 103 105 106 107 109 112 114 116 118 119 121 123 124 126 129 132 135 136 139 142 144 145 147 149 152 153 157 158 162 164 165 166 168 169 171 173 174 178

Introduction Le plan Domaine dutilisation Pourquoi un cours de C ? De nombreuses extensions Problmatique pdagogique Htrognit des lves Bibliographie Le plan Ressources & Bibliographie Monitorat Petite histoire Le plan Prhistoire C & Unix Story Notations typographiques utilises dans ce cours

Un ordinateur ? Mais quest-ce ? Le plan Les bases de la numrologie Le plan Un peu de numrologie Reprsentation des entiers Numrotation binaire Units binaires Autres bases drives du binaire Base 8 (octal) Base 16 (hexadcimal) Base 256 Authentication avec mot de passe jetable S/Key Base 65536 Calcul binaire Le plan Reprsenter des nombres ngatifs Nombres binaires en complment 2

57 58 59 60 62 63 65 66 68 69 70 71 72 73 75

Expressions Le plan Dnition des expressions Expressions lmentaires littrales Expressions lmentaires symbolique Constantes agrgats Constantes L-valeurs (lvalues) Constructions dexpression Priorit des oprateurs Conversions de type Smantique oprateurs Le plan Oprateur . Oprateur -> Indiage vecteur et matrices [] Appels de fonctions & procdures Arithmtique Arithmtique binaire Optimisations en binaire Applications codage binaire : multispin-coding Application utilisant des additions 9 et 6 bits Gaz sur rseau Expressions logiques Expression conditionnelle Oprateurs effet de bord Taille dun objet Coercition de type Le plan Coercition : conversion explicite de type cast en anglais Transtypage explicite ou cast Pointeurs & manipulation dadresses Arithmtique sur pointeurs Liste dexpressions

179 180 181 185 186 187 188 189 191 193 194 195 196 200 201 202 205 208 209 210 215 218 219 221 222 223 225 226 228 230 232

Langage Le plan

24 25 26 28 30 31 32 33 34 35 37 40 41 43 44 46 47 48 49 50

Gnralits Le plan Des instructions et expressions C... ... en passant par les fonctions C... ... aux programmes C Programme minimal en C Programme hello world en C Commentaires Vers un programme excutable Compilation dun programme Dclarer des fonctions Types et expressions Variables et dclaration Affectation de variables Visibilit des variables La vie est un long euve tranquille Tests Boucle tant que Boucle pour Bien prsenter les programmes C avant C UV2 INF 446 TLCOM Bretagne/Info/HPCAS E E

Dclarations Le plan Gnralits Le plan Objets en C Types en C Types arithmtiques en C Dclaration de variable Identicateurs Mots-cls rservs en C Types des objets Le plan Caractres Table des caractres ASCII Codage ISO-8859 Codage UNICODE Caractres de base Nombres entiers S. E VEN, S. G UELTON & R. K ERYELL

77 78 79 80 81 82 83 85 87 88 89 95 96 97 99 361 / 361

Instructions Le plan Instructions Instructions lmentaires Tests if S. E VEN, S. G UELTON & R. K ERYELL

233 234 235 237 361 / 361

TLCOM Bretagne/Info/HPCAS E E

Table des matires Aiguillage switch Boucle while Boucle do Boucle for Instructions de saut 239 240 241 242 243 Un diteur abordable Concepts de base Kit de survie Emacs est lourd Vers une analyse grammaticale des commandes Emacs Compilation Correction erreurs de syntaxe la vole Dbogueurs dans Emacs Tags Speedbar dition de chiers binaires Ncessit dun systme de gestion de version Gestion de version avec Emacs Gestion de version en local Gestion de version distance Gestion de version avec Emacs pour CVS et SVN TRAMP Modes spciques des langages Tuning de son clavier Le plan Retour aux sources : clavier QWERTY Revamper un clavier AZERTY en QWERTY Des accents ! Touches Meta et Alt Avec lexprience 289 290 291 293 295 296 297 298 299 300 301 302 304 306 307 309 310 311 312 313 314 315 316 318

Table des matires Dvermineur (debugger) Le plan Dbogueur Dbogueur GNU gdb Dbogueur ddd Analyse mmoire Le plan Mise au point allocation mmoire Le plan 332 333 335 338 339 340 Le btisier Le plan Loctal qui passe la trappe Choses (ne pas) faire Concours de programmes incomprhensibles Le plan Quimprime-ce ? Concours Retour aux sources de linformatique 350 351 352 353 354 355 356 357 358 359 360 384 388

Prprocesseur Le plan Prprocesseur Prprocesseur C (CPP) Inclusion de chiers Macroconstantes et macrofonctions Compilation conditionnelle Bibliothques Le plan Bibliothques Bibliothque standard Contenu bibliothque standard glibc Modle mmoire & allocation Le plan Modle mmoire du C Allocation dynamique Chanes de caractres strdup : LA fonction la plus utile du C Entres-sorties Le plan Entres-sorties sur stream Afchage format avec printf Lecture formate avec scanf goto non locaux GNOME Le plan GNOME Glib

245 246 247 248 249 254

13

Extensions Le plan Du C pour le graphisme Le plan CUDA Nouveaux formats de donnes C++ Le plan C++

344 345 346 347 348 349

15 16 17

Conclusion Le plan Conclusion Index Le plan Table des matires Le plan Vous tes ici !

256 257 258 260 263 264 265 267 269 271 272 274 277 278 281 282 283

14

Dlires

10

Compilation Le plan Principe Compilateur gcc Makele Modularisation Le plan Modularisation Fonctions Fichiers Utiliser des symboles Mise au point Le plan S. E VEN, S. G UELTON & R. K ERYELL

319 320 321 323 326 327 328 329 330

11

diteur exemple dEmacs Le plan diteur de texte Emacs : LE diteur C avant C UV2 INF 446 TLCOM Bretagne/Info/HPCAS E E

284 285 286

12

331 361 / 361

C avant C UV2 INF 446 TLCOM Bretagne/Info/HPCAS E E S. E VEN, S. G UELTON & R. K ERYELL 361 / 361

Vous aimerez peut-être aussi