Beruflich Dokumente
Kultur Dokumente
Master P&A/SDUEE
UE MNI (4P009)
Mthodes Numriques et Informatiques
Fortran 95/2003 et C
20152016
Sofian.Teber@lpthe.jussieu.fr
Jacques.Lefrere@upmc.fr
Albert Hertzog
Fortran et C
. . . . . . . . . . . . . . . . .
1.4 Historique . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 12
1.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 . . . . . . . . . . . . . . . . . . . . . . . . 16
1.7 Exemple de programme C avec une seule fonction utilisateur . . . . . 17
1.8 Exemple de programme fortran avec une seule procdure
MNI
. . . . . . 18
2015-2016
Fortran et C
19
. . . . . 19
33
MNI
2015-2016
Fortran et C
. . . . . . . . . . . . . . . . . . . . . . . 35
. . . . . . . . . . . . . . . . . . . . . . . 40
MNI
42
. . . . . . . . . . . . . . . 43
2015-2016
Fortran et C
48
. . . . . . . . . . . . . . . . . . . . . 49
5.1.1 Condition if . . . . . . . . . . . . . . . . . . . . . . . . . 49
5.1.2 Alternative if ... else . . . . . . . . . . . . . . . . . . . . 49
5.1.3 Exemples dalternative if ... else . . . . . . . . . . . . . . 51
5.1.4 Alternatives imbriques if ... else . . . . . . . . . . . . . 53
5.1.5 Aplatissement de limbrication avec else
5.2 Aiguillage avec switch/case
if en fortran . . . 54
. . . . . . . . . . . . . . . . . . 55
MNI
2015-2016
Fortran et C
. . . . . . . . . . . . . . . . . . . . . . . 64
. . 67
68
. . . . . . . . . . . . . . . . . . . . . . . . . 78
. . . . . . . . . . . . . . . . . 79
MNI
2015-2016
1 Introduction
Fortran et C
Introduction
Langage interprt
C, C++, fortran
optimisation possible
pas doptimisation
excution.
sont excutes
MNI
2015-2016
1 Introduction
Fortran et C
MNI
2015-2016
1 Introduction
Fortran et C
MNI
2015-2016
1 Introduction
Fortran et C
(1) dition
fichier source
essai.c
(prprocesseur)
(2) compilation
gcc c essai.c
compilation + lien
(2) + (3)
fichier objet
essai.o
gcc essai.o o essai.x
(3) lien
fichier excutable
essai.x
(4) excution
MNI
./essai.x
9
2015-2016
1 Introduction
Fortran et C
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.
fortran
gcc
gfortran
http://gcc.gnu.org
icc
Intel
MNI
10
ifort
2015-2016
1 Introduction
Fortran et C
gcc-mni-c89
gcc-mni-c99
MNI
gfortran-mni
gfortran2003-mni
11
2015-2016
1 Introduction
Fortran et C
1.4 Historique
1.4 Historique
1.4.1 Langage fortran :
MNI
12
2015-2016
1 Introduction
Fortran et C
1.4 Historique
1.4.2 Langage C
langage conu dans les annes 1970
1978 : The C Programming Langage de B. K ERNIGHAN et D. R ICHIE
dveloppement li la diffusion du systme UNIX
198890 : normalisation C89 ANSIISO (bibliothque standard du C)
Deuxime dition du K ERNIGHAN et R ICHIE norme 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...
norme C11 (ex-C1x) parue en avril 2011
base dautres langages dont le C++ (premier standard en 1998)
puis java, php, ...
MNI
13
2015-2016
1 Introduction
Fortran et C
Langage C
plus gnraliste
ex. : criture de systmes dexploitation
tableaux multidimensionnels et
fonctions associes (cf. matlab et scilab)
MNI
14
2015-2016
1 Introduction
Fortran et 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
MNI
15
2015-2016
1 Introduction
Fortran et C
langage Fortran
format du code
libre du fortran 90
fixe en fortran 77
la fin de la ligne
instruction compose }
entre /* et */
peut stendre sur plusieurs lignes
//
en C99 et C++
distinction
dlimiteurs de
commentaire
introducteur de
commentaire
fin de la ligne
maj/minuscule
!
pas de distinction
MNI
16
2015-2016
1 Introduction
MNI
17
*/
*/
*/
*/
*/
*/
*/
*/
*/
*/
*/
2015-2016
1 Introduction
Fortran et C
PROGRAM ppal
! << dbut du programme ppal
IMPLICIT NONE
! ncessaire en fortran
INTEGER :: i
! dclarations
INTEGER :: s = 0
! initialisation
DO i = 1, 5
! structure de boucle
s = s + i
END DO
!
<<= fin de bloc
WRITE(*,*) "somme des entiers de 1 5"
WRITE(*,*) "somme = ", s
! affichage
END PROGRAM ppal
! << fin du programme ppal
MNI
18
2015-2016
Fortran et C
taille
1 octet
MNI
non signs
signs
0 255 = 28 1
27 = 128 +127 = 27 1
19
2015-2016
+28 1
+0
Fortran et C
+1
+0
+1
28
n<0
+26
7
+27 + 1
7 +2 1
+2
+127
+129
+128
n>0
+26
7
27 + 1
7 +2 1
2
+127
127
128
Pour passer des positifs aux relatifs, on soustrait 28 dans la partie gauche du cercle.
MNI
20
2015-2016
Fortran et C
0, 30
fonction HUGE
/usr/include/limits.h
231 2 109
HUGE(1)
INT_MAX
263 9 1018
HUGE(1_8)
LLONG_MAX
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
Fortran et C
virgule fixe
virgule flottante
par troncature
0.0000123456789
0.000123456789
0.1234 104
.0001
0.1234 10
3
2
0.00123456789
.0012
0.1234 10
0.0123456789
.0123
0.1234 101
0
0.123456789
.1234
0.1234 10
1.23456789
1.2345
0.1234 101
12.3456
0.1234 10
123.4567
0.1234 103
12.3456789
123.456789
MNI
B .0000
22
Virgule flottante
en base 10
exposant
z}|{
1
0. 1234 10
|{z}
mantisse
2015-2016
Fortran et C
MNI
23
2015-2016
Fortran et C
2
+0
1/4
MIN
1/2
+1
+2
+4
chelle log
MAX
une octave (n valeurs)
chelle linaire ( exposant fix)
MNI
24
2015-2016
Fortran et C
X(1 + (n 1))
X = 2p X(1 + 2)
X(1 + )
X/2
X/2
X = X/n
X/2 = nX/2
2X
chelle linaire
X = nX
Exemple reprsent ici : deux octaves de flottants positifs avec mantisse sur m=3 bits
MNI
25
2015-2016
Fortran et C
MNI
nb total
mantisse
exposant
32 bits
23 bits
8 bits
64 bits
52 bits
11 bits
fortran
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
26
2015-2016
Fortran et C
DIGITS(x)
PRECISION(x)
EPSILON(x)
RANGE(x)
TINY(x)
HUGE(x)
MNI
27
2015-2016
Fortran et C
MNI
langage C
Type
////C99 bool
boolen
char
caractre
////(tableau de char)
chane de caractres
short int
entier court
int
long int
entier long
C99 long
long
fortran 90
logical
character(len=1)
character(len=....)
integer(kind=2)
integer
integer(kind=4/8)
28
integer(kind=8)
2015-2016
Fortran et C
MNI
langage C
Type
fortran 90
float
double
double precision
long double
real(kind=10/16)
////C99 complex
complexe
#include <tgmath>
+ variantes
29
real
complex
2015-2016
Fortran et C
C99
a
"chaine"
MNI
Type
false (0)
boolen
caractre
"sil"
17
17
021 (attention)
0x11
17L
chanes
entier court
entier dcimal
entier 1710 en octal
entier en hexadcimal
entier long
-47.1f
-47.1
-47.1L
-6.2e-2f
-6.2e-2
-6.2e-2L
2.3-I*.5
complexe
30
fortran 90
.TRUE.
a
chaine
.FALSE.
"a"
"sil"
17_2
17
O21
Z11
17_8
-47.1
-6.2e-2
47.1_8
-6.2e-2_8
47.1_16 -6.2e-2_16
(2.3, -5.)
2015-2016
Fortran et C
MNI
31
2015-2016
langage C >
Fortran et C
89
fortran >
C99 Nimporte o
90
int i = 2 ; (excution)
integer :: i = 2 (compilation)
const int i = 2 ;
penser aussi #define
MNI
integer, parameter :: i = 2
VAR 2
32
2015-2016
3 Oprateurs
Fortran et C
Oprateurs
MNI
langage C
fortran
entier = INT(flottant)
33
2015-2016
3 Oprateurs
Fortran et C
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));
nf = (float) n;
// conversion => approch 10^(-7)
printf("n (int)
= %d \nnf (float) = %.10g \n"
"b (float) =%.10g\n", n, nf, b);
float: 4 octets
n (int)
= 123456789
nf (float) = 123456792
b (float) =0.123456791
MNI
int: 4 octets
exact
approch
34
2015-2016
3 Oprateurs
Fortran et C
addition
soustraction
multiplication
division
lvation la puissance
reste modulo
langage C
fortran 90
+
-
+
-
*
/
pow(x,y)
%
*
/
**
mod(i,j)
difficults
div. entire
avec ngatifs
Oprations binaires mme type pour les oprandes (sauf rel**entier fortran)
Types diffrents conversion implicite vers le type le plus riche avant opration
MNI
35
2015-2016
3 Oprateurs
Fortran et C
MNI
langage C
fortran 90
rsultat
entier
boolen
infrieur
<
<
infrieur ou gal
<=
<=
gal
==
==
suprieur ou gal
>=
>=
suprieur
>
>
diffrent de
!=
/=
36
2015-2016
3 Oprateurs
Fortran et C
fortran 90
ET
&&
.AND.
OU
||
.OR.
NON
.NOT.
EQUIVALENCE
//////
.EQV.
OU exclusif
//////
.NEQV.
0),
mais le type boolen (bool) existe en C99, avec stdbool.h.
MNI
37
2015-2016
3 Oprateurs
Fortran et C
MNI
38
2015-2016
3 Oprateurs
Fortran et C
3.7
j += i
j = j + i
b *= a + c
b = b * (a + c)
Oprateur dalternative en C
exp1 ? exp2 : exp3 si exp1 est vraie, exp2 (alors exp3 nest pas value)
sinon exp3 (alors exp2 nest pas value)
Exemple :
MNI
39
2015-2016
3 Oprateurs
Fortran et C
sizeof identificateur
sizeof(type)
size_t n2;
n2 = sizeof(int);
3.9
Oprateur squentiel , en C
3.10
Oprateurs & et * en C
40
2015-2016
3 Oprateurs
3.11
Fortran et C
MNI
41
2015-2016
Fortran et C
fortran 90
criture sur stdout = cran
WRITE(*, *) &
liste dexpressions
lecture depuis stdin = clavier
scanf("format",
READ(*, *) &
liste de pointeurs);
liste de variables
format %d, %g ou %s ... selon le type pour
format libre (*) le plus simple
printf("format",
liste dexpressions);
spcifier \n en sortie
MNI
42
2015-2016
Fortran et C
fortran 2003
entiers
dcimal
%w[.p]d
%d
Iw[.p]
I0
rels
virgule fixe
%w[.p]f
virgule flottante
%w[.p]e
prfrer gnral
%w[.p]g
Fw.p
Ew.p
Gw.p
caractres
MNI
caractres
%w[.p]c
chane
%w[.p]s
43
A[w]
A[w]
2015-2016
Fortran et C
MNI
44
2015-2016
Fortran et C
PROGRAM read_write
IMPLICIT NONE
INTEGER :: i
REAL :: x
WRITE(*,*) "Entrer un
READ(*,*) i
WRITE(*,*) "La valeur
WRITE(*,*) "Entrer un
READ(*,*) x
WRITE(*,*) "La valeur
entier"
de i est ", i
rel "
de x est ", x
MNI
45
2015-2016
Fortran et C
Format
char
%c
chane
%s
%d
long
%ld
long long
%lld
float(convertis en)/double
long double
MNI
(%e, %f) %g
2015-2016
Fortran et C
MNI
Type
Format
char
%c
short
%hd
int
%d
long
%ld
long long
%lld
float
(%e, %f) %g
double
long double
47
2015-2016
5 Structures de contrle
Fortran et C
Structures de contrle
trop restrictif
Introduire des structures 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 ou break, ...)
MNI
48
2015-2016
5 Structures de contrle
Fortran et C
Structure conditionnelle if
5.1
Condition if
5.1.1
c
if
fortran 90
FAUSSE
condition
if (expression) instruction
if (expression) {
VRAIE
bloc dinstructions
bloc
bloc dinstructions
end if
expression teste
entier vrai si non nul en C89
MNI
49
de type boolen
2015-2016
5 Structures de contrle
Fortran et C
5.1.2
c
if
FAUSSE
if (expression) {
fortran 90
if (expr. log.) then
condition
bloc dinstructions 1
VRAIE
bloc 1
}
bloc 2
else {
else
bloc dinstructions 2
MNI
bloc dinstructions 1
bloc dinstructions 2
end if
50
2015-2016
5 Structures de contrle
5.1.3
Fortran et C
51
2015-2016
5 Structures de contrle
Fortran et C
! 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 IF
WRITE(*,*) "i =", i, ", j =", j , ", max = ", maxij
END PROGRAM alternative
MNI
52
2015-2016
5 Structures de contrle
5.1.4
Fortran et C
VRAIE
if
FAUSSE
condition
if
FAUSSE
condition
VRAIE
else if
else if
FAUSSE
else
condition
FAUSSE
condition
VRAIE
bloc
MNI
bloc
bloc
bloc
53
VRAIE
bloc
bloc
2015-2016
5 Structures de contrle
5.1.5
if en fortran
Structure aplatie un
end if
! deux if imbriqus
IF (i < -10) THEN ! externe
WRITE(*,*) "i < -10"
ELSE
IF (i < 10) THEN ! interne
WRITE(*,*) "-10 <= i < 10"
ELSE
WRITE(*,*) "i >= 10 "
END IF ! end if interne
END IF ! end if externe
MNI
Fortran et C
54
end if
2015-2016
5 Structures de contrle
Fortran et C
fortran 90
MNI
55
2015-2016
5 Structures de contrle
Fortran et C
case.c
switch (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
case.f90
SELECT CASE(i) ! i entier
! dbut de bloc
CASE(0)
WRITE(*,*) " i vaut 0 "
CASE(1)
WRITE(*,*) " i vaut 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
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
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
iteration
complete
OUI
nombre ditrations
while
condition
nombre ditrations
NON
FAUSSE
inconnu a priori
connu a priori
VRAIE
structure while
bloc
structure
for ou
bloc
do avec compteur
risque de boucle
incre
mentation
MNI
infinie
60
2015-2016
5 Structures de contrle
Fortran et C
fortran 90
}
while (expr. )
instruction
boucle
(avec compteur
en fortran)
tant que
faire
}
do {
instruction
} while (expr. ) ;
faire ...
tant que
Boucle for
MNI
61
2015-2016
5 Structures de contrle
Fortran et C
for.c
/* affichage des entiers impairs <= m */
/* mise en oeuvre de la structure "for" */
for (i = 1; i <= m; i = i + 2)
{
printf(" %d \n", i) ;
/* un bloc */
}
printf("-------\n"); /* en dehors du for ! */
exit(EXIT_SUCCESS) ;
MNI
62
2015-2016
5 Structures de contrle
Fortran et C
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
fortran 90
bouclage anticip
sortie anticipe
branchement
cycle
exit
go to tiquette-numrique
( viter)
a. ltiquette est un identificateur suivi de : en tte dinstruction.
MNI
64
2015-2016
5 Structures de contrle
Fortran et C
Rebouclage anticip
continue ou cycle
break ou exit
NON
NON
while
while
OUI
OUI
bloc 1
bloc 1
OUI
if
OUI
continue (C)
if
cycle (f90)
exit (f90)
NON
NON
bloc 2
bloc 2
MNI
break (C)
65
2015-2016
5 Structures de contrle
Fortran et C
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) ;
}
66
2015-2016
5 Structures de contrle
Fortran et C
int i = -1 , m = 11;
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 > m
WRITE(*,*) i
END DO
MNI
67
2015-2016
Fortran et C
MNI
68
2015-2016
Fortran et C
sizeof (float)
short int i ;
&i
MNI
float x ;
octet
adresse
&x
69
2015-2016
Fortran et C
sizeof (float)
i=10 ;
00
&i
MNI
0A
x=10.f ;
octet
41
adresse
&x
70
20
00
00
2015-2016
Fortran et C
pti
ptx
sizeof (float*)
float *ptx ;
pointeur de float
MNI
71
2015-2016
Fortran et C
pti = &i;
ptx = &x;
72
2015-2016
Fortran et C
sizeof (float)
short int i ;
float x ;
octet
&i
&x
adresse
pti= &i;
ptx= &x;
pti
MNI
ptx
sizeof (short int*)
sizeof (float*)
float *ptx ;
73
2015-2016
Fortran et C
pt = & x;
pt pointe vers x
sizeof (float)
sizeof (float)
float x ;
float y ;
*pt
&x
&y
pt
&x
sizeof (float*)
float *pt ;
MNI
74
2015-2016
Fortran et C
pt = & y;
pt pointe vers y
sizeof (float)
sizeof (float)
float x ;
float y ;
*pt
&x
&y
pt
&y
sizeof (float*)
float *pt ;
MNI
75
2015-2016
Fortran et C
j = *pti;
*pti = 4;
Attention :
pour que le codage/dcodage soit correct, il faut que le pointeur soit un pointeur
vers une variable de mme type que la cible.
affectation de la cible dsastreuse si le pointeur na pas t initialis
MNI
76
2015-2016
Fortran et C
sizeof (float)
short int i ;
float x ;
octet
&i
MNI
adresse
&x
*pti
*ptx
&i
&x
sizeof (float*)
float *ptx ;
77
2015-2016
Fortran et C
=> x
nullify(ptx)
Fonction boolenne dinterrogation associated
Mais les cibles potentielles doivent possder :
lattribut target (cible ultime)
ou lattribut pointer (cas des listes chanes)
MNI
78
2015-2016
Fortran et C
Langage C
type *ptr;
type *ptr=NULL;
type var; (pas dattribut)
ptr = &var ;
*ptr
ptr = NULL ;
Fortran 90
dclaration
avec initialisation
MNI
cible
pointer sur
ptr
dissocier
nullify(ptr); ptr=>null()
associ ?
associated(ptr)
la cible var ?
ptr2 = ptr1
79
associated(ptr, var)
concerne les cibles !
2015-2016
Fortran et C
MNI
80
2015-2016
Fortran et C
MNI
81
2015-2016
Fortran et C
MNI
82
2015-2016
Fortran et C
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
PROGRAM erreur_pointeur
IMPLICIT NONE
INTEGER, TARGET
:: i, j
Fortran et C
MNI
84
2015-2016