Upload
elgherybchoukri
View
217
Download
0
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