cours-f90+c

Embed Size (px)

Citation preview

  • 7/24/2019 cours-f90+c

    1/85

    UPMC Master P&A/SDUEE

    UE MNI (4P009)

    Mthodes Numriques et Informatiques

    Fortran 95/2003 et C

    20152016

    [email protected]@upmc.fr

    Albert Hertzog

  • 7/24/2019 cours-f90+c

    2/85

    Fortran et C

    Table des matires

    1 Introduction 6

    1.1 Langage compil et langage interprt . . . . . . . . . . . . . . . . 6

    1.2 Programmation en langage compil . . . . . . . . . . . . . . . . . 6

    1.3 Compilationet dition de liens . . . . . . . . . . . . . . . . . . . . 8

    1.4 Historique . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 121.4.1 Langage fortran . . . . . . . . . . . . . . . . . . . . . . . . 12

    1.4.2 Langage C . . . . . . . . . . . . . . . . . . . . . . . . . . 13

    1.5 Intrts respectifs du C et du fortran . . . . . . . . . . . . . . . . . 14

    1.6 Format des instructions. . . . . . . . . . . . . . . . . . . . . . . . 161.7 Exemple de programme C avec une seule fonction utilisateur . . . . . 17

    1.8 Exemple de programme fortran avec une seule procdure . . . . . . 18

    MNI 1 2015-2016

  • 7/24/2019 cours-f90+c

    3/85

    Fortran et C

    2 Types et dclarations des variables 19

    2.1 Reprsentation des nombres : domaine (range) et prcision . . . . . 19

    2.1.1 Domaine des entiers signs . . . . . . . . . . . . . . . . . . 19

    2.1.2 Limites des entiers sur 32 et 64 bits . . . . . . . . . . . . . . 21

    2.1.3 Domaine et prcision des flottants . . . . . . . . . . . . . . . 22

    2.1.4 Caractristiques numriques des flottants sur 32 et 64 bits. . . 26

    2.1.5 Caractristiques des types numriques en fortran . . . . . . . 27

    2.2 Typesde base . . . . . . . . . . . . . . . . . . . . . . . . . . . . 28

    2.3 Les constantes . . . . . . . . . . . . . . . . . . . . . . . . . . . . 30

    2.4 Dclarationsdes variables . . . . . . . . . . . . . . . . . . . . . . 31

    3 Oprateurs 33

    3.1 Oprateur daffectation . . . . . . . . . . . . . . . . . . . . . . . . 33

    MNI 2 2015-2016

  • 7/24/2019 cours-f90+c

    4/85

    Fortran et C

    3.2 Oprateurs algbriques . . . . . . . . . . . . . . . . . . . . . . . 35

    3.3 Oprateurs de comparaison . . . . . . . . . . . . . . . . . . . . . 35

    3.4 Oprateurs logiques . . . . . . . . . . . . . . . . . . . . . . . . . 36

    3.5 Incrmentation et dcrmentation en C . . . . . . . . . . . . . . . . 38

    3.6 Oprateurs daffectation compose en C . . . . . . . . . . . . . . . 39

    3.7 Oprateur dalternative en C . . . . . . . . . . . . . . . . . . . . . 39

    3.8 Oprateur sizeof en C . . . . . . . . . . . . . . . . . . . . . . . . 40

    3.9 Oprateur squentiel , en C . . . . . . . . . . . . . . . . . . . . 40

    3.10 Oprateurs & et * en C . . . . . . . . . . . . . . . . . . . . . . . 40

    3.11 Priorits desoprateurs en C. . . . . . . . . . . . . . . . . . . . . 41

    4 Entres et sorties standard lmentaires 42

    4.1 Introduction aux formats dentresortie . . . . . . . . . . . . . . . 43

    MNI 3 2015-2016

  • 7/24/2019 cours-f90+c

    5/85

    Fortran et C

    4.1.1 Introduction auxformats en C . . . . . . . . . . . . . . . . . 46

    5 Structures de contrle 48

    5.1 Structure conditionnelle if . . . . . . . . . . . . . . . . . . . . . 49

    5.1.1 Condition if . . . . . . . . . . . . . . . . . . . . . . . . . 49

    5.1.2 Alternative if ... else. . . . . . . . . . . . . . . . . . . . 49

    5.1.3 Exemples dalternative if ... else . . . . . . . . . . . . . . 515.1.4 Alternatives imbriques if ... else . . . . . . . . . . . . . 53

    5.1.5 Aplatissement de limbrication avec else if en fortran . . . 54

    5.2 Aiguillage avec switch/case . . . . . . . . . . . . . . . . . . 55

    5.2.1 Exemples daiguillage case . . . . . . . . . . . . . . . . . 56

    5.3 Structures itratives ou boucles. . . . . . . . . . . . . . . . . . . . 60

    5.3.1 Exemples de boucle for ou do . . . . . . . . . . . . . . . 62

    MNI 4 2015-2016

  • 7/24/2019 cours-f90+c

    6/85

    Fortran et C

    5.4 Branchements ou sauts . . . . . . . . . . . . . . . . . . . . . . . 64

    5.4.1 Exemples de bouclage anticip cycle/continue . . . . . 66

    5.4.2 Exemples de sortie anticipe de boucle via break/exit . . 67

    6 Introduction aux pointeurs 68

    6.1 Intrt des pointeurs . . . . . . . . . . . . . . . . . . . . . . . . . 68

    6.2 Pointeurs et variables : exemple du C . . . . . . . . . . . . . . . . . 69

    6.2.1 Affectation dun pointeur en C . . . . . . . . . . . . . . . . . 72

    6.2.2 Indirection (oprateur en C) . . . . . . . . . . . . . . . . . 76

    6.3 Pointeurs enfortran . . . . . . . . . . . . . . . . . . . . . . . . . 78

    6.4 Syntaxe des pointeurs (C et fortran) . . . . . . . . . . . . . . . . . 79

    6.5 Exemples lmentaires (C et fortran) . . . . . . . . . . . . . . . . . 80

    6.6 Initialiser les pointeurs !. . . . . . . . . . . . . . . . . . . . . . . . 82

    MNI 5 2015-2016

  • 7/24/2019 cours-f90+c

    7/85

    1 Introduction Fortran et C

    1 Introduction

    1.1 Langage compil et langage interprt

    Langagecompil Langageinterprt

    C, C++,fortran shell,python, perl, php, scilab

    Le compilateur analyse lensemble

    du programme avant de le traduire en

    langage machine une fois pour toutes.

    optimisationpossible

    Lexcutable produit estautonome

    mais dpend du processeur

    Linterprteurexcute le code source

    (script) instruction par instruction.

    pas doptimisation

    Linterprteur est ncessaire chaque

    excution.

    En cas derreur de syntaxe

    le binaire nest pas produit,

    donc pas dexcutable !

    les instructions avant lerreur

    sont excutes

    Compil+interprt, par exemplejava

    compilation bytecode portable interprt par JVM (machine virtuelle java)

    MNI 6 2015-2016

  • 7/24/2019 cours-f90+c

    8/85

    1 Introduction Fortran et C 1.2 Programmation en langage compil

    1.2 Programmation en langage compil

    Lestapesde la programmation (itrer si ncessaire) :

    conception: dfinir lobjectif du programme et la mthode utiliser

    algorithme puis organigramme puis pseudo-code

    codage: crire le programme suivant la syntaxe dun langage de haut niveau,

    et utilisant des bibliothques : C, fortran, ...

    codesource : fichier texte avec instructions commentes

    comprhensible pour le concepteur... et les autres

    Seul le fichiersourceestportable(indpendant de la machine)

    compilation: transformer le code source en un code machine

    codeobjetpuis codeexcutable: fichiers binaires excution: tester le bon fonctionnement du programme

    exploitation du code et production des rsultats

    MNI 7 2015-2016

  • 7/24/2019 cours-f90+c

    9/85

    1 Introduction Fortran et C 1.3 Compilation et dition de liens

    1.3 Compilation et dition de liens

    Fichiersource(texte) de suffixe .c en C (.f90 en fortran 90)crit au moyen dunditeur de texte

    Fichierobjet(binaire) de suffixe .o :

    code machine gnr par lecompilateur

    Fichierexcutable(binaire) a.out par dfaut

    produit par lditeur de liens

    La commande de compilation gcc essai.c ou gfortran essai.f90

    lance par dfaut trois actions :

    1. traitement par leprprocesseur(cpp) des lignes commenant par #

    appeles directives (transformation textuelle)

    2. compilation proprement parler fichier objet essai.o

    3. dition de liens(link) : le compilateur lance ld fichier excutable a.out

    assemblage des codes objets et rsolution des appels aux bibliothques

    MNI 8 2015-2016

  • 7/24/2019 cours-f90+c

    10/85

    1 Introduction Fortran et C 1.3 Compilation et dition de liens

    c essai.cgcc

    gcc essai.o o essai.x

    ogcc essai.c essai.x

    (prprocesseur)

    (1)

    (2)

    (3)

    (4) ./essai.x

    vi essai.c / emacs essai.c

    compilation + lien

    (2) + (3)

    lien

    compilation

    dition

    excution

    fichier excutableessai.x

    fichier objet

    essai.o

    fichier sourceessai.c

    MNI 9 2015-2016

  • 7/24/2019 cours-f90+c

    11/85

    1 Introduction Fortran et C 1.3 Compilation et dition de liens

    Rle du compilateur

    analyser le code source, signaler les erreurs de syntaxe ,

    produire des avertissements sur les constructions suspectes,

    convertir un code source en code machine (sauf erreur de syntaxe !),

    optimiser le code machine.

    faire du compilateur un assistant efficacepour anticiper les problmes

    avant des erreurs ldition de liens ou, pire, lexcution.

    C fortran

    GNU Compiler Collection gcc gfortranDocumentation http://gcc.gnu.org

    Intel icc ifort

    MNI 10 2015-2016

    http://gcc.gnu.org/
  • 7/24/2019 cours-f90+c

    12/85

    1 Introduction Fortran et C 1.3 Compilation et dition de liens

    Principales options de compilation

    Options permettant de choisir les tapes et les fichiers :

    -c : prprocesseur et compilation seulement (produit lobjet)

    -o essai.x : permet de spcifier le nom du fichier excutable

    -ltruc donne ldlaccs labibliothque libtruc.a

    ex. : -lmpour libm.a, bibliothque mathmatique indispensable en C

    option placeraprsles fichiers appelants

    Options utiles lamise au point :

    conformit aux standards du langage : -std=c99 ou -std=f2003

    avertissements (warnings) sur les instructions suspectes (variables non

    utilises, instructions apparemment inutiles, changement de type, ...) : -Wall

    vrification des passages de paramtres

    (ncessite un contrle interprocdural, donc les prototypes ou interfaces)

    alias avec options svres et prcision du standard

    gcc-mni-c89 gfortran-mni

    gcc-mni-c99 gfortran2003-mni

    MNI 11 2015-2016

  • 7/24/2019 cours-f90+c

    13/85

    1 Introduction Fortran et C 1.4 Historique

    1.4 Historique

    1.4.1 Langage fortran : Fortran =FormulaTranslation

    1954 : premier langage decalcul scientifique(tltypes, puis cartes perfores)

    ...

    1978 : fortran V ou fortran 77

    1991 : fortran 90 (volution majeure mais un peu tardive)

    format libre, fonctions tableaux, allocation dynamique, structures, modules...

    ne plus crire de fortran 77 1997 :fortran 95= mise jour mineure

    2004 : fortran 2003 standard adopt

    nouveauts :interoprabilit avec C, arithmtique IEEE, accs au systme,

    allocations dynamiques tendues, aspects objet...

    fortran 2003 implment sur certains compilateurs (en cours pour gfortran) 2010 (20 sept) : adoption du standardfortran 2008

    futur standard fortran 2015 en cours de rvision

    MNI 12 2015-2016

  • 7/24/2019 cours-f90+c

    14/85

    1 Introduction Fortran et C 1.4 Historique

    1.4.2 Langage C

    langage conu dans les annes 1970

    1978 : The C Programming Langagede B. KERNIGHANet D. RICHIE

    dveloppement li la diffusion du systmeUNIX

    198890 : normalisation C89ANSIISO (bibliothque standard du C)

    Deuxime dition du KERNIGHANet RICHIEnorme ANSI

    1999 : norme C99

    nouveaux types (boolen, complexe, entiers de diverses tailles (prise en compte

    des processeurs 64 bits), caractres larges (unicode), ...),

    gnricit dans les fonctions numriques,

    dclarations tardives des variables,tableaux automatiques de taille variable...

    normeC11(ex-C1x) parue en avril 2011

    base dautres langages dont leC++(premier standard en 1998)

    puis java, php, ...

    MNI 13 2015-2016

  • 7/24/2019 cours-f90+c

    15/85

    1 Introduction Fortran et C 1.5 Intrts respectifs du C et du fortran

    1.5 Intrts respectifs du C et du fortran

    Langage fortran Langage C

    codes portableset prennes grce aux normes du langage et des bibliothques

    langages de haut niveau

    structures de contrle, structures de donnes, fonctions, compilation spare, ...

    gnricit des fonctions mathmatiques mais aussi ... langage de bas niveau

    (manipulation de bits, dadresses, ...)

    langage puissant, efficace

    mais aussi ...peu permissif mais aussi ...permissif !

    spcialis pour le calcul scientifique plus gnraliste

    ex. : criture de systmes dexploitation

    tableaux multidimensionnelset

    fonctions associes (cf. matlab et scilab)

    MNI 14 2015-2016

  • 7/24/2019 cours-f90+c

    16/85

    1 Introduction Fortran et C 1.5 Intrts respectifs du C et du fortran

    Exemple : appel une procdure de la bibliothque LAPACKpour le calcul des lments propres dune matrice mm relle.

    Langage C

    info = lapacke_sgeev(CblasColMajor, V, N,

    m, (float *)matrice,

    m, (float *)valpr_r, (float *)valpr_i,

    (float *)vectpr_l, m, (float *)vectpr_r, m);

    12 arguments + status de retour optionnel

    Langage Fortran 90

    call la_geev(matrice, valpr_r, valpr_i, &

    vectpr_l, vectpr_r, info= info )

    5 arguments seulement + status optionnel pass parmot-clef

    MNI 15 2015-2016

  • 7/24/2019 cours-f90+c

    17/85

    1 Introduction Fortran et C 1.6 Format des instructions

    1.6 Format des instructions

    langage C langage Fortran

    libre format du code libredu fortran 90

    fixe en fortran 77

    mettre en vidence les structures par la mise en page (indentation)

    une instruction

    se termine par

    instruction simple ;instruction compose }

    la fin de la lignesauf si & la fin

    entre /* et */peut stendre sur plusieurs lignes

    dlimiteurs decommentaire

    //

    en C99 et C++

    introducteur decommentaire

    fin de la ligne

    !

    distinction maj/minuscule pas de distinction

    lignes de directives pour le prprocesseur : # en premire colonne

    MNI 16 2015-2016

  • 7/24/2019 cours-f90+c

    18/85

    1 Introduction Fortran et C 1.7 Exemple de programme C avec une seule fonction utilisateur

    1.7 Exemple de programme C avec une seule fonction

    utilisateur :main

    #include /* instructions prprocesseur */

    #include /* pas de ";" en fin */

    int main(void) /* fonction principale */

    { /*

  • 7/24/2019 cours-f90+c

    19/85

    1 Introduction Fortran et C 1.8 Exemple de programme fortran avec une seule procdure

    1.8 Exemple de programme fortran avec une seule procdure

    PROGRAM ppal !

  • 7/24/2019 cours-f90+c

    20/85

    2 Types et dclarations des variables Fortran et C

    2 Types et dclarations des variables

    2.1 Reprsentation des nombres : domaine (range) et prcision

    Nombre de bits fixe (typage statique) domaine couvert limit

    Mais distinguer :

    lesentiers reprsents exactement

    lesrels reprsents approximativementen virgule flottante ne jamais compter avec des rels

    2.1.1 Domaine des entiers signs

    Exempleintroductif des entiers sur1 octet(8 bits) :28 = 256valeurs possibles

    taille non signs signs

    1 octet 0 255 = 28 1 27 = 128 +127 = 27 1

    MNI 19 2015-2016

  • 7/24/2019 cours-f90+c

    21/85

    2 Types et dclarations des variables Fortran et C 2.1 Reprsentation des nombres : domaine (range) et prcision

    +0

    +27

    +128

    +27 1+127

    +28 1 +1

    +27 + 1+129

    +26

    Entierspositifssur 8 bitsDiscontinuiten haut gauche de 0

    +0

    27

    128

    +27 1+127

    +11

    27 + 1127

    n >0

    +26

    n

  • 7/24/2019 cours-f90+c

    22/85

    2 Types et dclarations des variables Fortran et C 2.1 Reprsentation des nombres : domaine (range) et prcision

    2.1.2 Limites des entiers sur 32 et 64 bits

    Rappel :log102 0,30 210

    = 1024 = 1010 log

    10(2)

    103

    fortran C

    fonction HUGE /usr/include/limits.h

    sur 32 bits = 4 octets 231 2 109 HUGE(1) INT_MAX

    sur 64 bits = 8 octets 263 9 1018 HUGE(1_8) LLONG_MAX

    Dpassement de capacit en entier positif passage en ngatif

    en fortran, choix des variantes (KIND) dentiers selon le domaine (range) par la

    fonction SELECTED_INT_KIND(...)

    en C89, les tailles des entiers dpendent du processeur

    C99 : types entiers tendus nb doctets impos, par exemple : int32_t

    MNI 21 2015-2016

  • 7/24/2019 cours-f90+c

    23/85

    2 Types et dclarations des variables Fortran et C 2.1 Reprsentation des nombres : domaine (range) et prcision

    2.1.3 Domaine et prcision des flottants

    Reprsentation approche envirgule flottantepour concilier dynamique et prcision

    Par exempleen base 10, avec 4 chiffres aprs la virgule, comparer les

    reprsentations approches (par troncature) en virgule fixe et flottante :

    nombre exact virgule fixe virgule flottante

    par troncature

    0.0000123456789 .0000 0.1234 104

    0.000123456789 .0001 0.1234 103

    0.00123456789 .0012 0.1234 102

    0.0123456789 .0123 0.1234 101

    0.123456789 .1234 0.1234 100

    1.23456789 1.2345 0.1234 101

    12.3456789 12.3456 0.1234 102

    123.456789 123.4567 0.1234 103

    Virgule flottante

    en base 10

    0. 1234

    mantisse

    10

    exposant

    1

    MNI 22 2015-2016

  • 7/24/2019 cours-f90+c

    24/85

    2 Types et dclarations des variables Fortran et C 2.1 Reprsentation des nombres : domaine (range) et prcision

    En binaire, nombre de bits rparti entremantisse(partie fractionnaire) etexposant

    m bits de mantisse prcision limite

    qbits de l exposant domaine finiAjouter 1 bit de signe nombre de bits=m + q+ 1

    exposant (puissance de 2) fix :progression arithmtiquedans chaque octave

    2m valeurs par octave

    = la plus petite valeur telle que 1 + soit le successeur de 1

    est le pas des flottants dans loctave[1, 2[ = 1/2m

    Prcision relative = 1/2m

    Flottants sur 32 bits : m= 23 bits de mantisse = 223 106/8

    Octaves enprogression gomtriquede raison 2

    qbits dexposant 2q 2octaves (+ codes non numriques)

    Flottants sur 32 bits : q= 8 bits dexposant donc254 octaves

    Domaine : MAX 1/MIN 2127 1,7 1038

    MNI 23 2015-2016

  • 7/24/2019 cours-f90+c

    25/85

    2 Types et dclarations des variables Fortran et C 2.1 Reprsentation des nombres : domaine (range) et prcision

    Domaine des flottants fix par le nombre de bits qde lexposant

    En virgule flottante, les octaves sont en progression gomtrique de raison 2 :Nombre doctaves 2q , rparties presque symtriquement autour de 1.

    +1+0

    MIN MAX

    une octave (n valeurs)

    chelle log

    +2

    chelle linaire ( exposant fix)

    2

    +41/4 1/2

    Domaine des flottants positifs normaliss ( chelle log)

    MNI 24 2015-2016

  • 7/24/2019 cours-f90+c

    26/85

    2 Types et dclarations des variables Fortran et C 2.1 Reprsentation des nombres : domaine (range) et prcision

    Prcision des flottants fixe par le nombre de bits m de la mantisse

    Dans chaque octave [2p, 2p+1[= [X, 2X[, lexposant est constant

    n= 2m flottants enprogression arithmtique de pasX=X/n = X

    X= 2pX/2 2X

    X/2 X=X/n

    2 2

    X=nXX/2 =nX/2

    chelle linaire

    X(1 + )X( 1 + 2)

    X(1 + (n 1))

    Exemple reprsent ici : deux octaves de flottants positifs avec mantisse sur m=3 bits

    n= 2m = 23 = 8intervalles et aussi 8 valeurs par octave

    MNI 25 2015-2016

  • 7/24/2019 cours-f90+c

    27/85

    2 Types et dclarations des variables Fortran et C 2.1 Reprsentation des nombres : domaine (range) et prcision

    2.1.4 Caractristiques numriques des flottants sur 32 et 64 bits

    nb total mantisse exposant

    32 bits 23 bits 8 bits

    64 bits 52 bits 11 bits

    fortran C valeur

    simple prc. HUGE(1.) FLT_MAX 3, 4 1038

    = 4 octets TINY(1.) FLT_MIN 1,18 1038

    = 32 bits EPSILON(1.) FLT_EPSILON 223 1, 2 107

    double prc. HUGE(1.d0) DBL_MAX 1, 8 10308

    = 8 octets TINY(1d0) DBL_MIN 2, 2 10308

    = 64 bits EPSILON(1.d0) DBL_EPSILON 252 2, 2 1016

    MNI 26 2015-2016

  • 7/24/2019 cours-f90+c

    28/85

    2 Types et dclarations des variables Fortran et C 2.1 Reprsentation des nombres : domaine (range) et prcision

    2.1.5 Caractristiques des types numriques en fortran

    DIGITS(x) nombre debitsde |x| si entier, de sa mantisse si rel

    PRECISION(x) nombre dechiffres(dcimaux) significatifs de x

    EPSILON(x) plus grande valeur du type de x ngligeable devant 1

    RANGE(x) puissance de 10 du domaine de x (plus petite valeur absolue)

    TINY(x) plus petite valeur positive reprsentable dans le type de x

    HUGE(x) plus grande valeur positive reprsentable dans le type de x

    Portabilit numrique du code

    demander la variante (KIND) du type numrique suffisante

    ki = SELECTED_INT_KIND(r) pour les entiers allant jusqu10r

    kr = SELECTED_REAL_KIND(p,r) pour les relspour un domaine de10r 10r et une prcision10p (p chiffres significatifs)

    MNI 27 2015-2016

  • 7/24/2019 cours-f90+c

    29/85

    2 Types et dclarations des variables Fortran et C 2.2 Types de base

    2.2 Types de base

    Types reprsentsexactement

    langage C Type fortran 90

    ////C99bool boolen logical

    char caractre

    character(len=1)

    ////(tableau de char) chane de caractres character(len=....)

    short int entier court integer(kind=2)

    int entier par dfaut integer

    long int entier long integer(kind=4/8)

    C99 long long entier long long integer(kind=8)

    MNI 28 2015-2016

  • 7/24/2019 cours-f90+c

    30/85

    2 Types et dclarations des variables Fortran et C 2.2 Types de base

    Types reprsents approximativement

    en virgule flottante : mantisse et exposant

    langage C Type fortran 90

    float rel simple prcision (32 bits) realdouble double prcision (64 bits) double precision

    long double prcision tendue ( 80) real(kind=10/16)

    ////C99 complex complexe complex

    #include + variantes

    MNI 29 2015-2016

  • 7/24/2019 cours-f90+c

    31/85

    2 Types et dclarations des variables Fortran et C 2.3 Les constantes

    2.3 Les constantes

    langage C C99 Type fortran 90

    /////C99 : true (= 0) false (0) boolen .TRUE. .FALSE.

    a caractre a "a"

    "chaine" "sil" chanes chaine "sil"

    17 entier court 17_2

    17 entier dcimal 17 021 (attention) entier 1710en octal O21

    0x11 entier en hexadcimal Z11

    17L entier long 17_8

    -47.1f -6.2e-2f rel simple prcision -47.1 -6.2e-2

    -47.1 -6.2e-2 double prcision 47.1_8 -6.2e-2_8-47.1L -6.2e-2L double prcision long 47.1_16 -6.2e-2_16

    /////sauf I C99 : 2.3-I*.5 complexe (2.3, -5.)

    MNI 30 2015-2016

  • 7/24/2019 cours-f90+c

    32/85

    2 Types et dclarations des variables Fortran et C 2.4 Dclarations des variables

    2.4 Dclarations des variables

    Typage statique=> dclarer le type de chaque variable

    Dclarerune variable = rserver une zone en mmoire pour la stocker

    Variable type lui associer un nombre de bits et un codage

    (correspondance entre valeur et tat des bits en mmoire vive)

    La taille de la zone et le codage dpendent du type de la variable.

    Les bits de la zone ont au dpart des valeurs imprvisibles, sauf si...

    Initialiserune variable = lui affecter une valeur lors de la rservation de la mmoire

    Dclarationsen tte des procdures: obligatoire en fortranet conseill en C89

    EnC99: dclarations tardives autorises mais prfrer en tte de bloc

    MNI 31 2015-2016

  • 7/24/2019 cours-f90+c

    33/85

    2 Types et dclarations des variables Fortran et C 2.4 Dclarations des variables

    langage C 89 fortran 90

    en tte des blocs C99 Nimporte o en tte des procdures

    Syntaxe

    type identificateur1, identificateur2 ... ; type :: identificateur1, identificateur2, ...

    Exemple : dclaration de 3 entiers

    int i, j2, k_max ; integer :: i, j2, k_max

    Initialisation : lors de la dclaration

    i n t i = 2 ; (excution) integer :: i = 2 (compilation)

    Dclaration de constantes (non modifiables)

    const i n t i = 2 ; integer, parameter : : i = 2penser aussi #define VAR 2 utilisable comme une vraie constante

    MNI 32 2015-2016

  • 7/24/2019 cours-f90+c

    34/85

    3 Oprateurs Fortran et C

    3 Oprateurs

    3.1 Oprateur daffectation

    Laffectation = peut provoquer une conversionimplicitede type!

    problmes de reprsentation des valeurs numriques :

    tendue(range) : ex. dpassement par conversion flottant vers entier

    prcision: ex. conversion entier exact vers flottant approch Prfrer les conversionsexplicites

    langage C fortran

    lvalue =(type)expression variable =type(expression)

    conversion force(oprateurcast) grce des fonctions intrinsquesentier = (int) flottant; entier = INT(flottant)

    MNI 33 2015-2016

  • 7/24/2019 cours-f90+c

    35/85

    3 Oprateurs Fortran et C 3.1 Oprateur daffectation

    int n = 123456789; // exact

    float b = 0.123456789f; // approch

    float nf;

    printf("float: %d octets \t int: %d octets\n",

    (int) sizeof(float), (int) sizeof(int));

    n f = (float) n; // conversion => approch 10^(-7)

    printf("n (int) = %d \nnf (float) = %.10g \n""b (float) =%.10g\n", n, nf, b);

    float: 4 octets int: 4 octets

    n (int) = 123456789 exact

    nf (float) = 123456792 approchb (float) =0.123456791

    MNI 34 2015-2016

  • 7/24/2019 cours-f90+c

    36/85

    3 Oprateurs Fortran et C 3.2 Oprateurs algbriques

    3.2 Oprateurs algbriques

    langage C fortran 90 difficults

    addition + +

    soustraction - -

    multiplication * *

    division / / div. entire

    lvation la puissance pow(x,y) **

    reste modulo % mod(i,j) avec ngatifs

    Oprations binaires mme type pour les oprandes (sauf rel**entier fortran)

    Types diffrents conversion implicitevers le type le plus riche avant opration

    MNI 35 2015-2016

  • 7/24/2019 cours-f90+c

    37/85

    3 Oprateurs Fortran et C 3.3 Oprateurs de comparaison

    3.3 Oprateurs de comparaison

    langage C fortran 90

    rsultat entier boolen

    infrieur < >

    diffrent de != /=

    MNI 36 2015-2016

  • 7/24/2019 cours-f90+c

    38/85

    3 Oprateurs Fortran et C 3.4 Oprateurs logiques

    3.4 Oprateurs logiques

    langage C a fortran 90

    ET && .AND.

    OU || .OR.

    NON ! .NOT.

    EQUIVALENCE ////// .EQV.

    OU exclusif ////// .NEQV.

    a. Rappel : pas de type boolen en C89 (faux=0, vrai si = 0),

    mais le type boolen (bool) existe enC99, avec stdbool.h.

    MNI 37 2015-2016

  • 7/24/2019 cours-f90+c

    39/85

    3 Oprateurs Fortran et C 3.5 Incrmentation et dcrmentation en C

    3.5 Incrmentation et dcrmentation en C

    post-incrmentationet post-dcrmentationi++ incrmente /i-- dcrmente i dune unit,

    aprsvaluation de lexpression

    p=2; n=p++; donne n=2 et p=3

    p=2; n=p--; donne n=2 et p=1

    pr-incrmentationetpr-dcrmentation

    ++i incrmente /--i dcrmente i dune unit,

    avantvaluation de lexpression

    p=2; n=++p; donne n=3 et p=3

    p=2; n=--p; donne n=1 et p=1

    i = i++; indtermin!

    MNI 38 2015-2016

  • 7/24/2019 cours-f90+c

    40/85

    3 Oprateurs Fortran et C 3.6 Oprateurs daffectation compose en C

    3.6 Oprateurs daffectation compose en C

    lvalue oprateur = expression lvalue = lvalue oprateur expression

    Exemples :

    j += i j = j + i

    b *= a + c b = b * (a + c)

    3.7 Oprateur dalternative en C

    exp1 ? exp2 : exp3 siexp1est vraie,exp2 (alors exp3 nest pas value)

    sinonexp3 (alors exp2 nest pas value)

    Exemple :

    c = (a>b) ? a : b affecte le max de a et b c

    MNI 39 2015-2016

  • 7/24/2019 cours-f90+c

    41/85

    3 Oprateurs Fortran et C 3.8 Oprateur sizeof en C

    3.8 Oprateur sizeof en C

    Taille en octets dun objet ou dun type (rsultat de type size_t).

    Cet oprateur permet damliorer la portabilit des programmes.

    sizeof identificateur

    size_t n1; double a;

    n1 = sizeof a;

    sizeof(type)

    size_t n2;

    n2 = sizeof(int);

    3.9 Oprateur squentiel , en C

    expr1 , expr2permet dvaluer successivement les expressionsexpr1et expr2.

    Utilis essentiellement dans les structures de contrle (if, for, while).

    3.10 Oprateurs & et * en C

    &objet adresse de lobjet

    *pointeur objet point (indirection)

    MNI 40 2015-2016

  • 7/24/2019 cours-f90+c

    42/85

    3 Oprateurs Fortran et C 3.11 Priorits des oprateurs en C

    3.11 Priorits des oprateurs en C

    oprateurs unaires +, -, ++, --, !, ~, *, &, sizeof, (cast)

    oprateurs algbriques *, /, %

    oprateurs algbriques +, -

    oprateurs de dcalage

    oprateurs relationnels =

    oprateurs relationnels ==, != oprateurs sur les bits &, puis ^, puis |

    oprateurs logiques &&, puis ||

    oprateur conditionnel ? :

    oprateurs daffectation = et les affectations composes

    oprateur squentiel ,

    indiquer les priorits avec des parenthses !

    MNI 41 2015-2016

    4 E i d d l i F C

  • 7/24/2019 cours-f90+c

    43/85

    4 Entres et sor ties standard lmentaires For tran et C

    4 Entres et sorties standard lmentaires

    C fortran 90

    criture sur stdout = cran

    printf("format",

    liste dexpressions);

    WRITE(*, *) &

    liste dexpressions

    lecture depuis stdin = clavierscanf("format",

    liste de pointeurs);

    READ(*, *) &

    liste de variables

    format %d, %g ou %s ... selon le type pour

    chaque variable (gabarit optionnel)

    formatlibre(*) le plus simple

    mais on peut prciser

    spcifier \n en sortiepour changer de ligne

    forcer par / dans le formatchangement denregistrement chaque

    ordre READ ouWRITE

    MNI 42 2015-2016

    4 E t t ti t d d l t i F t t C 4 1 I t d ti f t d t ti

  • 7/24/2019 cours-f90+c

    44/85

    4 Entres et sor ties standard lmentaires For tran et C 4.1 Introduction aux formats dentresor tie

    4.1 Introduction aux formats dentresortie

    Correspondance trs approximative entre C et fortran (w =largeur, p= prcision)

    c fortran 2003

    entiers

    dcimal %w[.p]d Iw[.p]

    %d I0

    rels

    virgule fixe %w[.p]f Fw.p

    virgule flottante %w[.p]e Ew.p

    prfrer gnral %w[.p]g Gw.p

    caractrescaractres %w[.p]c A[w]

    chane %w[.p]s A[w]

    MNI 43 2015-2016

    4 E t t ti t d d l t i F t t C 4 1 I t d ti f t d t ti

  • 7/24/2019 cours-f90+c

    45/85

    4 Entres et sor ties standard lmentaires For tran et C 4.1 Introduction aux formats dentresor tie

    #include /* entres sorties standard */

    #include

    int main(void) {

    int i;

    float x;

    double y;

    printf("Entrer un entier\n");

    scanf("%d", &i); /* passer laddresse */

    printf("La valeur de i est %d\n", i);

    printf("Entrer un float, un double \n");

    scanf("%g %lg", &x, &y); /* passer les adresses */

    printf(" x = % g e t y = % g \ n ", x , y );

    exit(EXIT_SUCCESS);

    }

    MNI 44 2015-2016

    4 Entres et sor ties standard lmentaires For tran et C 4 1 Introduction aux formats dentre sor tie

  • 7/24/2019 cours-f90+c

    46/85

    4 Entres et sor ties standard lmentaires For tran et C 4.1 Introduction aux formats d entresor tie

    PROGRAM read_write

    IMPLICIT NONE

    INTEGER :: i

    REAL :: x

    WRITE(*,*) "Entrer un entier"

    READ(*,*) i

    WRITE(*,*) "La valeur de i est ", i

    WRITE(*,*) "Entrer un rel "

    READ(*,*) x

    WRITE(*,*) "La valeur de x est ", x

    END PROGRAM read_write

    MNI 45 2015-2016

    4 Entres et sor ties standard lmentaires For tran et C 4 1 Introduction aux formats dentre sor tie

  • 7/24/2019 cours-f90+c

    47/85

    4 Entres et sor ties standard lmentaires For tran et C 4.1 Introduction aux formats d entresor tie

    4.1.1 Introduction aux formats en C

    Attention: quelques diffrences entre scanf (type exact)

    etprintf (conversionde type possible car passage dargument par copie)

    En sortie avec printf

    Type Format

    char %c

    chane %s

    short (converti en)/int %d

    long %ld

    long long %lld

    float(convertis en)/double (%e, %f) %g

    long double (%Le, %Lf) %Lg

    MNI 46 2015-2016

    4 Entres et sor ties standard lmentaires For tran et C 4 1 Introduction aux formats dentre sor tie

  • 7/24/2019 cours-f90+c

    48/85

    4 Entres et sor ties standard lmentaires For tran et C 4.1 Introduction aux formats d entresor tie

    En entre avec scanf

    Type Format

    char %c

    short %hd

    int %d

    long %ld

    long long %lld

    float (%e, %f) %g

    double (%le, %lf) %lg

    long double (%Le, %Lf) %Lg

    MNI 47 2015-2016

    5 Structures de contrle Fortran et C

  • 7/24/2019 cours-f90+c

    49/85

    5 Structures de contrle Fortran et C

    5 Structures de contrle

    Par dfaut, excution squentielle des instructions une seule fois,

    dans lordre spcifi par le programme.

    trop restrictif

    Introduire desstructures de contrles(flow control) permettant de modifier le

    cheminement lors de lexcution des instructions :

    excution conditionnelle (if/else)

    ou aiguillage (case) dans les instructions

    itration de certains blocs (for, do, while...)

    branchements (cycle ou continue, exit oubreak, ...)

    Mettre en vidence les blocs par indentation du code(cf python)

    Nommagepossible des structures en fortran (utile pour les branchements)

    MNI 48 2015-2016

    5 Structures de contrle Fortran et C 5 1 Structure conditionnelle if

  • 7/24/2019 cours-f90+c

    50/85

    5 Structures de contrle Fortran et C 5.1 Structure conditionnelle if

    5.1 Structure conditionnelle if

    5.1.1 Condition if

    FAUSSE

    VRAIE

    if

    condition

    bloc

    c fortran 90

    if (expression)instruction if (expr. log.)instruction

    if (expression) { if (expr. log.) then

    bloc dinstructions bloc dinstructions

    } end if

    expression teste

    entiervrai si non nul en C89 de typeboolen

    MNI 49 2015-2016

    5 Structures de contrle Fortran et C 5 1 Structure conditionnelle if

  • 7/24/2019 cours-f90+c

    51/85

    5 Structures de contrle Fortran et C 5.1 Structure conditionnelle if

    5.1.2 Alternative if ... else

    FAUSSE

    VRAIE

    if

    condition

    bloc 1 bloc 2

    c fortran 90

    if (expression) { if (expr. log.) then

    bloc dinstructions 1 bloc dinstructions 1

    }

    else { else

    bloc dinstructions 2 bloc dinstructions 2

    } end if

    MNI 50 2015-2016

    5 Structures de contrle Fortran et C 5 1 Structure conditionnelle if

  • 7/24/2019 cours-f90+c

    52/85

    5 Structures de contrle Fortran et C 5.1 Structure conditionnelle if

    5.1.3 Exemples dalternative if ... else

    #include /* fichier if2.c */

    #include int main(void)

    { /* structure if ... else */

    int i, j, max ;

    printf("entrer i et j (entiers)\n") ;

    scanf("%d %d", &i, &j) ;

    i f ( i > = j ) { /* affichage du max de 2 nombres */

    printf(" i > = j \ n ") ;

    max = i ; /* bloc dinstructions */

    } else {

    max = j ; /* instruction simple */

    }printf(" i= %d, j= %d, max = %d\n", i, j, max);

    exit(EXIT_SUCCESS) ;

    }

    MNI 51 2015-2016

    5 Structures de contrle Fortran et C 5.1 Structure conditionnelle if

  • 7/24/2019 cours-f90+c

    53/85

    5 Structures de contrle Fortran et C 5.1 Structure conditionnelle if

    ! structure if then ... else ... endif

    ! affichage du max de deux nombres

    PROGRAM alternative

    IMPLICIT NONE

    INTEGER :: i, j, maxij

    WRITE(*,*) "entrer i et j (entiers)"

    READ(*,*) i , j

    IF (i >= j) THEN

    WRITE(*,*) " i > = j "

    maxij = i ! bloc dinstructions

    ELSE

    maxij = j ! instruction simple

    END IFWRITE(*,*) "i =", i, " , j = ", j , " , m a x = ", maxij

    END PROGRAM alternative

    MNI 52 2015-2016

    5 Structures de contrle Fortran et C 5.1 Structure conditionnelle if

  • 7/24/2019 cours-f90+c

    54/85

    5 St uctu es de co t e o t a et C 5 St uctu e co d t o e e

    5.1.4 Alternatives imbriques if ... else

    Imbrication simple deux niveaux

    blocbloc

    FAUSSEelse if

    condition

    bloc

    FAUSSEif

    condition

    VRAIE

    VRAIE

    Fusion des retours un niveau

    VRAIE

    bloc

    VRAIE

    bloc bloc

    FAUSSE FAUSSEif

    condition

    else if

    condition

    else

    MNI 53 2015-2016

    5 Structures de contrle Fortran et C 5.1 Structure conditionnelle if

  • 7/24/2019 cours-f90+c

    55/85

    5.1.5 Aplatissement de limbrication avec else if en fortran

    Structures imbriques deux end if

    ! deux if imbriqus

    IF (i < -10) THEN ! externe

    WRITE(*,*) "i < -10"

    ELSEIF (i < 10) THEN ! interne

    WRITE(*,*) "-10 = 1 0 "

    END IF ! end if interneEND IF ! end if externe

    Structure aplatie un end if

    ! structure avec ELSE IF

    IF (i < -10) THEN

    WRITE(*,*) "i < -10"

    ! ELSEIF sur une mme ligneELSE IF (i < 10) THEN

    WRITE(*,*) "-10 = 1 0 "

    END IF ! un seul END IF

    MNI 54 2015-2016

    5 Structures de contrle Fortran et C 5.2 Aiguillage avec switch/case

  • 7/24/2019 cours-f90+c

    56/85

    g g

    5.2 Aiguillage avec switch/case (pas avec des flottants)

    c fortran 90

    switch (expr. entire) { select case (expr.)caseslecteur1 : case (slecteur1)

    bloc dinstructions bloc dinstructions[break ;]

    caseslecteur2 : case (slecteur2)bloc dinstructions bloc dinstructions[break ;]

    ... ...default : case default

    bloc dinstructions bloc dinstructions

    } end select

    slecteurexpressionconstanteentire ou caractre expressionconstanteentire ou caractre

    ouliste

    ouintervallefini ou semi-infini, Sansbreak, on teste tous les cas

    qui suivent le premier slecteur vrai !

    MNI 55 2015-2016

    5 Structures de contrle Fortran et C 5.2 Aiguillage avec switch/case

  • 7/24/2019 cours-f90+c

    57/85

    g g

    5.2.1 Exemples daiguillage case

    case.cswitch (i) /* i entier */

    { /* dbut de bloc */

    case 0 :

    printf(" i vaut 0 \n") ;

    break; /* necessaire ici ! */case 1 :

    printf(" i vaut 1 \n") ;

    break; /* necessaire ici ! */

    default :

    printf(" i diffrent de 0 et de 1 \n") ;

    } /* fin de bloc */

    MNI 56 2015-2016

    5 Structures de contrle Fortran et C 5.2 Aiguillage avec switch/case

  • 7/24/2019 cours-f90+c

    58/85

    case.f90SELECT CASE(i) ! i entier ! dbut de bloc

    CASE(0)

    WRITE(*,*) " i v a u t 0 "

    CASE(1)

    WRITE(*,*) " i v a u t 1 "

    CASE default

    WRITE(*,*) " i diffrent de 0 et de 1 "

    END SELECT ! fin de bloc

    MNI 57 2015-2016

    5 Structures de contrle Fortran et C 5.2 Aiguillage avec switch/case

  • 7/24/2019 cours-f90+c

    59/85

    case1.c/* structure case sans break

    * pour "factoriser des cas"

    et les traiter en commun */

    switch (c) /* c de type char */

    {

    case ? :

    case ! :

    case ; :

    case : :

    printf(" ponctuation double \n") ;

    break ; /* la fin des 4 cas */

    default :

    printf(" autre caractre \n") ;}

    MNI 58 2015-2016

    5 Structures de contrle Fortran et C 5.2 Aiguillage avec switch/case

  • 7/24/2019 cours-f90+c

    60/85

    case1.f90! select case avec des listes de constantes

    ! pour les cas traiter en commun

    SELECT CASE (c) ! de type CHARACTER(len=1)

    CASE (?,!,;,:)

    WRITE(*,*) "ponctuation double"

    CASE default

    WRITE(*,*) "autre caractre "

    END SELECT

    MNI 59 2015-2016

    5 Structures de contrle Fortran et C 5.3 Structures itratives ou boucles

  • 7/24/2019 cours-f90+c

    61/85

    5.3 Structures itratives ou boucles

    Choix selon que le nombre ditrations est calculable avant ou non :

    NON

    incrementation

    OUI

    bloc

    iteration

    complete

    ? nombre ditrations

    connu a priori

    structure for ou

    do avec compteur

    FAUSSE

    VRAIE

    bloc

    while

    condition

    nombre ditrations

    inconnu a priori

    structure while

    risque de boucle

    infinie

    MNI 60 2015-2016

    5 Structures de contrle Fortran et C 5.3 Structures itratives ou boucles

  • 7/24/2019 cours-f90+c

    62/85

    c fortran 90

    for (expr1; expr2; expr3) { boucle doentier = dbut, fin[, pas]

    bloc dinstructions (avec compteur bloc dinstructions

    } en fortran) end do

    while (expr. ) { tant que do while (expr. log.)

    instruction faire bloc dinstructions

    } end do

    do { faire ...

    instruction} while (expr.) ; tant que

    Boucle for

    expr1 valueune foisavant lentre dans la boucle

    gnralement initialisation dun compteur

    expr2 : condition darrt value avant chaque itration expr3 value la fin de chaque itration

    gnralement incrmentation du compteur

    MNI 61 2015-2016

    5 Structures de contrle Fortran et C 5.3 Structures itratives ou boucles

  • 7/24/2019 cours-f90+c

    63/85

    5.3.1 Exemples de boucle for ou do

    for.c/* affichage des entiers impairs

  • 7/24/2019 cours-f90+c

    64/85

    do.f90! affichage des entiers impairs infrieurs m

    ! structure "do" avec compteur

    DO i = 1 , m , 2 ! i de 1 m par pas de 2

    ! dbut de bloc

    WRITE (*,*) i ! bloc rduit une instruction

    ! fin de bloc

    END DO

    MNI 63 2015-2016

    5 Structures de contrle Fortran et C 5.4 Branchements ou sauts

  • 7/24/2019 cours-f90+c

    65/85

    5.4 Branchements ou sauts

    c fortran 90

    continue ; bouclage anticip cycle

    break ; sortie anticipe exitgototiquette; a branchement go totiquette-numrique

    ( viter)

    a. ltiquette est un identificateur suivi de : en tte dinstruction.

    MNI 64 2015-2016

  • 7/24/2019 cours-f90+c

    66/85

    5 Structures de contrle Fortran et C 5.4 Branchements ou sauts

  • 7/24/2019 cours-f90+c

    67/85

    5.4.1 Exemples de bouclage anticip cycle/continue

    int i = 0 , m = 11;while ( i < m ){ /* rebouclage anticip via continue */

    i++ ;

    if ( ( i % 2 ) = = 0 ) continue ; /* si i pair */

    printf(" %d \n", i) ;

    }

    i = 0 ! recyclage anticip via "cycle"

    DO WHILE ( i < m )

    i = i + 1 ! modification de la condition du while

    IF ( MOD( i , 2 ) = = 0 ) CYCLE ! rebouclage si i pairWRITE(*,*) i

    END DO

    MNI 66 2015-2016

    5 Structures de contrle Fortran et C 5.4 Branchements ou sauts

  • 7/24/2019 cours-f90+c

    68/85

    5.4.2 Exemples de sortie anticipe de boucle viabreak/exit

    int i = - 1 , m = 1 1;while ( 1 ) { /* toujours vrai */

    i + = 2 ;

    if ( i > m ) break ; /* sortie de boucle */

    printf(" %d \n", i) ;

    }

    i = - 1 ! initialisation

    DO ! boucle infinie a priori

    i = i + 2

    IF( i > m ) EXIT ! sortie anticipe ds que i > mWRITE(*,*) i

    END DO

    MNI 67 2015-2016

    6 Introduction aux pointeurs Fortran et C

  • 7/24/2019 cours-f90+c

    69/85

    6 Introduction aux pointeurs

    6.1 Intrt des pointeurs

    variables permettant de dsigner successivement diffrentes variables afin de :

    faire un intervenir un niveau supplmentaire de paramtrage dans la

    manipulation des donnes : actionindirectesur une variable

    crer ou supprimer des variables lors de lexcution :allocation dynamique

    diffrencesnotables entre pointeurs enCet enfortran

    indispensables en C

    pour les arguments des fonctions

    et les tableaux dynamiques

    stockent desadressesdes variables

    absents en fortran 77,

    mais introduits en fortran 90/95

    et tendus en fortran 2003

    pas daccs aux adresses

    utilisation commune :tris sur des donnes volumineuses, implmentation de

    structures de donnes auto-rfrences (listes chanes par ex.)

    MNI 68 2015-2016

    6 Introduction aux pointeurs Fortran et C 6.2 Pointeurs et variables : exemple du C

  • 7/24/2019 cours-f90+c

    70/85

    6.2 Pointeurs et variables : exemple du C

    Dclarer une variable duntypedonn =

    rserver une zone mmoire dont

    lataille(sizeof en C) dpend du type

    et lecodageest fix par le type

    ? ? ? ? ??

    sizeof (float)sizeof (short int)

    short int i ; float x ;

    adresse&i &x

    octet

    MNI 69 2015-2016

    6 Introduction aux pointeurs Fortran et C 6.2 Pointeurs et variables : exemple du C

  • 7/24/2019 cours-f90+c

    71/85

    Affecter une valeur une variable dun type donn =

    crire la valeur dans les cases rserves selon le codage du type

    00 000020410A

    i=10 ;

    octet

    x=10.f ;

    sizeof (float)sizeof (short int)

    &i &xadresse

    MNI 70 2015-2016

    6 Introduction aux pointeurs Fortran et C 6.2 Pointeurs et variables : exemple du C

  • 7/24/2019 cours-f90+c

    72/85

    Dclarer une variable pointeur vers untype donn=

    rserver une zone mmoire pour stockerdes adresses

    de variables de ce type :les pointeurs sont typs

    leurtypeindique latailleet lecodagede laciblepotentielle

    ? ? ? ? ? ? ? ?

    sizeof (float*)sizeof (short int*)

    short int *pti ; float *ptx ;

    ptxpti

    pointeur dentier court pointeur de float

    La taille du pointeur est indpendante du type point

    Elle dpend du processeur (32/64 bits).

    MNI 71 2015-2016

    6 Introduction aux pointeurs Fortran et C 6.2 Pointeurs et variables : exemple du C

  • 7/24/2019 cours-f90+c

    73/85

    6.2.1 Affectation dun pointeur en C

    Affecter ladresse dune variable un pointeur :

    pti = &i; ptx = &x;

    = copier ladresse mmoire de la variable cible (oprateur &)

    dans la zone mmoire rserve lors de la dclaration du pointeur.

    le pointeurpti pointe surla variable i,

    la variable i est la cible dupointeurpti.

    Attention :

    il faut que les variablescibles i et x aient tdclares au pralable.

    comme pour une variable ordinaire, ladresse contenue dans le pointeur est

    indtermine avant laffectation du pointeur

    initialiser un pointeur avant de le manipulerAffecter lavaleur dun pointeur pty un pointeurdemme type ptx :

    ptx = pty ; (recopie dadresse)

    MNI 72 2015-2016

    6 Introduction aux pointeurs Fortran et C 6.2 Pointeurs et variables : exemple du C

  • 7/24/2019 cours-f90+c

    74/85

    Faire pointer un pointeur vers une variable =

    crire ladresse de la variable dans les cases rserves pour le pointeur

    = affecter une valeur la variable pointeur

    pti= &i; ptx= &x;

    pti ptx

    sizeof (float)sizeof (short int)

    sizeof (float*)sizeof (short int*)

    octet

    short int i; float x ;

    short int *pti ; float *ptx ;

    &i &xadresse

    MNI 73 2015-2016

    6 Introduction aux pointeurs Fortran et C 6.2 Pointeurs et variables : exemple du C

  • 7/24/2019 cours-f90+c

    75/85

    Aprs avoir fait pt = & x; pt pointe vers x

    &x

    *pt

    sizeof (float*)

    sizeof (float)sizeof (float)

    float y ;

    &x &y

    float *pt;

    float x;

    pt

    MNI 74 2015-2016

    6 Introduction aux pointeurs Fortran et C 6.2 Pointeurs et variables : exemple du C

  • 7/24/2019 cours-f90+c

    76/85

    Aprs avoir fait pt = & y; pt pointe vers y

    &y

    *pt

    sizeof (float*)

    sizeof (float)sizeof (float)

    float y ;

    &x &y

    float *pt;

    float x;

    pt

    MNI 75 2015-2016

    6 Introduction aux pointeurs Fortran et C 6.2 Pointeurs et variables : exemple du C

  • 7/24/2019 cours-f90+c

    77/85

    6.2.2 Indirection (oprateur en C)

    Loprateur * dindirection permet daccder la variable pointevia le pointeur

    (donc indirectement).

    j = *pti; la variable j prend la valeur de la cible de pti

    *pti = 4; la cible de pti vaut dsormais 4

    Attention :

    pour que le codage/dcodage soit correct, il faut que le pointeur soit un pointeur

    vers une variable demme type que la cible.

    affectation de la cible dsastreuse si le pointeur na pas t initialis

    modification possible dune autre variable (erreur alatoire sournoise)

    ou accs une zone mmoire interdite (segmentation fault : mieux!)

    MNI 76 2015-2016

    6 Introduction aux pointeurs Fortran et C 6.2 Pointeurs et variables : exemple du C

  • 7/24/2019 cours-f90+c

    78/85

    Opration dindirection(*) sur un pointeur =

    accs aux variables cibles

    *pti *ptx

    &i &x

    sizeof (float)sizeof (short int)

    sizeof (float*)sizeof (short int*)

    octet

    short int i; float x ;

    short int *pti ; float *ptx ;

    &i &xadresse

    MNI 77 2015-2016

    6 Introduction aux pointeurs Fortran et C 6.3 Pointeurs en fortran

  • 7/24/2019 cours-f90+c

    79/85

    6.3 Pointeurs en fortran

    Notionplus haut niveauquen C : pas daccs aux adresses!

    Pointeur considr comme unalias de la cible: le pointeur dsigne la cible

    pas doprateur dindirection

    Pas de type pointeur :pointer est unsimple attributdune variable

    Associationdun pointeur une cible par loprateur =>

    Exemple :ptx => x signifie ptx pointe vers x

    Dsassociationdun pointeur ptx => null() ou

    nullify(ptx)

    Fonction boolenne dinterrogation associated

    Mais les cibles potentiellesdoivent possder :

    lattribut target (cible ultime)

    ou lattributpointer (cas des listes chanes)

    MNI 78 2015-2016

    6 Introduction aux pointeurs Fortran et C 6.4 Syntaxe des pointeurs (C et fortran)

  • 7/24/2019 cours-f90+c

    80/85

    6.4 Syntaxe des pointeurs (C et fortran)

    Langage C Fortran 90

    type *ptr; dclaration type, pointer :: ptr

    type *ptr=NULL; avec initialisation type, pointer :: ptr=>null()

    type var; (pas dattribut) cible type, target (ncessaire) :: var

    ptr = &var ; pointer sur ptr => var (associer ptr var)

    *ptr variable pointe par ptr

    ptr = NULL ; dissocier nullify(ptr); ptr=>null()

    associ ? associated(ptr)

    la cible var ? associated(ptr, var)

    concerne lesadresses ! ptr2 = ptr1 concerne lescibles !

    MNI 79 2015-2016

    6 Introduction aux pointeurs Fortran et C 6.5 Exemples lmentaires (C et fortran)

  • 7/24/2019 cours-f90+c

    81/85

    6.5 Exemples lmentaires (C et fortran)

    /* usage lmentaire dun pointeur */

    #include

    #include

    int main(void){

    int i=1, j=2;

    int *pi = NULL; // initialis

    pi = &i; // pi devient ladresse de lentier iprintf("%d\n", *pi) ; // affiche i

    pi = &j; // pi devient ladresse de lentier j

    printf("%d\n", *pi) ; // affiche j

    *pi= 5; // affectation de la cible de pi, soit j

    printf("i=%d, j=%d, *pi=%d\n", i , j , *pi) ;

    exit(EXIT_SUCCESS);

    }

    MNI 80 2015-2016

    6 Introduction aux pointeurs Fortran et C 6.5 Exemples lmentaires (C et fortran)

  • 7/24/2019 cours-f90+c

    82/85

    PROGRAM pointeur ! usage lmentaire dun pointeur

    IMPLICIT NONE

    INTEGER, TARGET :: i, j ! target obligatoire pour pointer versINTEGER, POINTER :: pi => NULL()

    i = 1

    j = 2

    ! association entre pointeur et cible

    pi => i ! pi pointe sur i

    ! affectation

    WRITE(*,*) "i=", i, " j=", j, " pi= ", pi

    pi => j ! maintenant pi pointe sur j et plus sur i

    WRITE(*,*) "i=", i, " j=", j, " pi= ", pi

    pi = -5 ! modif de j via le pointeur

    WRITE(*,*) "i=", i, " j=", j, " pi= ", piEND PROGRAM pointeur

    MNI 81 2015-2016

    6 Introduction aux pointeurs Fortran et C 6.6 Initialiser les pointeurs !

  • 7/24/2019 cours-f90+c

    83/85

    6.6 Initialiser les pointeurs !

    Dclarer un pointeur ne rserve pas de mmoire pour la zone pointe !

    Ladresse quil contient est alatoire

    le rsultat dune indirection est aussi alatoire

    initialiser les pointeurs NULL ou null()

    pour forcer une erreur en cas dindirection sur un pointeur non associ.

    MNI 82 2015-2016

    6 Introduction aux pointeurs Fortran et C 6.6 Initialiser les pointeurs !

  • 7/24/2019 cours-f90+c

    84/85

    int i;

    /* pointeur non initialis => erreur alatoire daccs mmoire */

    int *pi, *pj;

    pi = &i; /* pi devient ladresse de lentier i */

    /* affichage des valeurs des pointeurs pi et pj */

    printf("valeurs des pointeurs = adresses\n");

    printf("pi=%019lu\npj=%019lu\n", (unsigned long int) pi,

    (unsigned long int) pj);i = 1;

    /* suivant lordre de decl. *pi, *pj => ? mais *pj, *pi erreur */

    printf("i=%d, *pi=%d , *pj=%d\n", i, *pi, *pj); /* aleatoire*/

    /* si laffichage se fait, il est aleatoire (statique/dynamique) *

    =*pj = 2; /* => erreur fatale en criture */

    /* accs une zone interdite quand on affecte 2 ladresse pj */

    MNI 83 2015-2016

    6 Introduction aux pointeurs Fortran et C 6.6 Initialiser les pointeurs !

  • 7/24/2019 cours-f90+c

    85/85

    PROGRAM erreur_pointeur

    IMPLICIT NONE

    INTEGER, TARGET :: i, j ! target obligatoire pour pointer vers i et j

    INTEGER, POINTER :: pi => null() ! spcifie absence dassociation de pi! sinon tat indtermin du pointeur par dfaut -> le prciser

    j = 2

    WRITE(*,*) "au dpart : pi associ ?", associated(pi)

    ! linstruction suivante provoque un accs mmoire interdit

    = pi = 3 ! affectation dune valeur un pointeur non associ : erreur

    ! il faut dabord associer pi une variable cible comme suit

    pi => i ! associe pi i dont la valeur est pour le moment indtermine

    WRITE(*,*) "aprs pi=>i : pi associ ?", associated(pi)

    WRITE(*,*) "aprs pi=>i : pi associ i ?", associated(pi,i)

    i = 1 ! donc pi vaudra 1

    WRITE(*,*) "aprs i=1 : i= ", i, " j = ", j, " p i = ", pi

    pi = 10 * pi ! on modifie en fait la cible pointe par pi

    WRITE(*,*) "aprs pi=10*pi : i= ", i, " j = ", j, " p i = ", pi

    pi => j ! pi pointe maintenant sur j qui vaut 2

    WRITE(*,*) "aprs pi=>j : pi associ i ?", associated(pi,i)WRITE(*,*) "aprs pi=>j : i = ", i, " j = ", j, " p i = ", pi

    END PROGRAM erreur_pointeur