1 / 16

“Rappels” de C, la suite

ECP – Option SA Henri Fallon <henri.fallon@centraliens.net>. “Rappels” de C, la suite. Macros. « Instructions » de remplacement sont interprétées avant le compilateur remplacement « textuel » exemples :. #define PI 3.141592 #define CINQ (3+2) ‏ #define BIZARRE ,12);

kimberly
Download Presentation

“Rappels” de C, la suite

An Image/Link below is provided (as is) to download presentation Download Policy: Content on the Website is provided to you AS IS for your information and personal use and may not be sold / licensed / shared on other websites without getting consent from its author. Content is provided to you AS IS for your information and personal use only. Download presentation by click this link. While downloading, if for some reason you are not able to download a presentation, the publisher may have deleted the file from their server. During download, if you can't get a presentation, the file might be deleted by the publisher.

E N D

Presentation Transcript


  1. ECP – Option SA Henri Fallon <henri.fallon@centraliens.net> “Rappels” de C, la suite

  2. Macros • « Instructions » de remplacement • sont interprétées avant le compilateur • remplacement « textuel » • exemples : #define PI 3.141592 #define CINQ (3+2)‏ #define BIZARRE ,12); printf("Pi vaut %f, Cinq vaut %d, et douze vaut %d\n", PI, CINQ BIZARRE printf("Pi vaut %f, Cinq vaut %d, et douze vaut %d\n", 3.141592, (3+2) ,12);

  3. Macro : danger #define CINQ 3+2 printf("3*5 vaut-il %d ?\n", 3*CINQ); printf("3*5 vaut-il %d ?\n", 3*3+2); /* Correct */ #define CINQ (3+2)‏ #define FOIS_TROIS(x) (x*3)‏ printf("cinq fois trois vaut-il %d?\n",FOIS_TROIS(3+2)); printf("cinq fois trois vaut-il %d?\n",(3+2*3)); /* Correct */ #define FOIS_TROIS(x) ((x)*3)‏

  4. Choix multiples • Pour éviter les nombreux « if » « else » switch( variable ) { case valeur_1: instructions_1; break; case valeur_2: instructions_juste_pour_2; /* que se passe-t-il si on ne met pas break ? */ case valeur_3: instructions_pour_2_et_3; break; default : printf("Valeur inconnue"); break; }

  5. Meilleur contrôle des boucles • Sortir d'une boucle : break int i=0; while(1) { printf("trois fois en tout\n"); if( ++i > 3 )‏ break; } /* Nous venons de réinventer la boucle "for" */ • Passer à l'éxécution suivante : continue int i; for( i=-5; i<6; i++ ) { /* Evitons la division par zéro */ if( !i )‏ continue; printf( "100/%d = %d\n", i, 100/i ); }

  6. Les structures • Permettent de clarifier le code en stockant dans une seule variable un ensemble de variables struct rectangle { unsigned int longueur; unsigned int largeur; } r; r.longueur = 12; r.largeur = 42; printf("L'aire de r est %d\n", r.longueur * r.largeur );

  7. Les structures (2)‏ • Lourdeur des déclaration : struct rectangle { unsigned int longueur; unsigned int largeur; } r; struct rectangle r2; r.longueur = 12; r.largeur = 42; r2=r; printf("L'aire de r est %d\n", r.longueur * r.largeur );

  8. Definir ses types • instruction typedef typedef int mytype_int; typedef struct _rectangle { unsigned int longueur; unsigned int largeur; } rectangle; rectangle r; r.longueur = 12; r.largeur = 42; printf("L'aire de r est %d\n", r.longueur * r.largeur );

  9. La memoire • Variable dans les fonctions • dites « automatiques » • allouées au début de la fonction • automatiquement désallouées à la fin • La fonction malloc • permet d'allouer un « morceau » de memoire • qui persiste même après le retour de la fonction • ne la libère pas automatiquement : risque de « fuite memoire »

  10. Variables automatiques : le piège char * chaine( void ) { char c[]= "chaine de retour"; return c; } /* ce programme va planter ! */ int main(void) { char * test; test = chaine(); printf("%s\n", test ); return 0; }

  11. malloc : allocation dynamique char * chaine( void ) { char * c; c = (char *)malloc( 5 * sizeof(char) ); return c; } /* ce programme va fonctionner ! */ int main( void ) { char * test; test = chaine(); printf("%s\n", test ); return 0; }

  12. libération • La memoire allouée reste allouée ! • Possibilité de « perdre » le pointeur : memory leak • La fonction free /* ce programme va fonctionner ! */ int main( void ) { char * test; test = chaine(); printf("%s\n", test ); free(test); return 0; }

  13. ré-allocation • fonction realloc • même retour que malloc

  14. Bonnes pratiques • tester le retour de malloc • toujours libérer la memoire dès que possible • lire le manuel des fonctions : allouent-elles la memoire ou doit-on l'allouer avant ? • utiliser sizeof if( (p=malloc( taille * sizeof( int ) ) == NULL ) { printf("Erreur d'allocation\n"); return -1; } p[0] = 12; /* .... */

  15. Les cast (transtypage)‏ • Conversion explicite d'un type à un autre • Attentions aux casts implicites ! unsigned int positif = 10; int negatif = -12; if( positif < negatif ) { printf("ah ben bravo l'implicite"); } if( negatif < (int)positif ) { printf("Il faut tout faire soi-même"); }ᄇ

  16. A la pratique !

More Related