Sie sind auf Seite 1von 85

UPMC

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

Table des matires


1 Introduction

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

1.2 Programmation en langage compil

. . . . . . . . . . . . . . . . .

1.3 Compilation et dition de liens . . . . . . . . . . . . . . . . . . . .

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

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 Types de base . . . . . . . . . . . . . . . . . . . . . . . . . . . . 28
2.3 Les constantes . . . . . . . . . . . . . . . . . . . . . . . . . . . . 30
2.4 Dclarations des variables . . . . . . . . . . . . . . . . . . . . . . 31
3 Oprateurs

33

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

MNI

2015-2016

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 des oprateurs en C . . . . . . . . . . . . . . . . . . . . . 41


4 Entres et sorties standard lmentaires
4.1 Introduction aux formats dentresortie

MNI

42
. . . . . . . . . . . . . . . 43

2015-2016

Fortran et C

4.1.1 Introduction aux formats en C . . . . . . . . . . . . . . . . . 46


5 Structures de contrle
5.1 Structure conditionnelle if

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

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

2015-2016

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
6 Introduction aux pointeurs

. . 67
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 en fortran

. . . . . . . . . . . . . . . . . . . . . . . . . 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

2015-2016

1 Introduction

Fortran et C

Introduction

1.1 Langage compil et langage interprt


Langage compil

Langage interprt

C, C++, fortran

shell, python, perl, php, scilab

Le compilateur analyse lensemble

Linterprteur excute le code source

du programme avant de le traduire en

(script) instruction par instruction.

langage machine une fois pour toutes.

optimisation possible

pas doptimisation

Lexcutable produit est autonome

Linterprteur est ncessaire chaque

mais dpend du processeur

excution.

En cas derreur de syntaxe


le binaire nest pas produit,

les instructions avant lerreur

donc pas dexcutable !

sont excutes

Compil + interprt, par exemple java


compilation bytecode portable interprt par JVM (machine virtuelle java)

MNI

2015-2016

1 Introduction

Fortran et C

1.2 Programmation en langage compil

1.2 Programmation en langage compil


Les tapes de 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, ...

code source : fichier texte avec instructions commentes


comprhensible pour le concepteur... et les autres

B Seul le fichier source est portable (indpendant de la machine)


compilation : transformer le code source en un code machine

code objet puis code excutable : fichiers binaires


excution : tester le bon fonctionnement du programme

exploitation du code et production des rsultats

MNI

2015-2016

1 Introduction

Fortran et C

1.3 Compilation et dition de liens

1.3 Compilation et dition de liens


Fichier source (texte) de suffixe .c en C (.f90 en fortran 90)
crit au moyen dun diteur de texte
Fichier objet (binaire) de suffixe .o :
code machine gnr par le compilateur
Fichier excutable (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 le prprocesseur (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

2015-2016

1 Introduction

Fortran et C

1.3 Compilation et dition de liens

vi essai.c / emacs essai.c

(1) dition

fichier source

gcc essai.c o essai.x

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

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 efficace pour anticiper les problmes


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

GNU Compiler Collection


Documentation

fortran

gcc

gfortran

http://gcc.gnu.org

icc

Intel

MNI

10

ifort

2015-2016

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 ld laccs la bibliothque libtruc.a
ex. : -lm pour libm.a, bibliothque mathmatique indispensable en C
option placer aprs les fichiers appelants
Options utiles la mise 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
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 :

Fortran = Formula Translation

1954 : premier langage de calcul 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 standard fortran 2008
futur standard fortran 2015 en cours de rvision

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

1.5 Intrts respectifs du C et du fortran

1.5 Intrts respectifs du C et du fortran


Langage fortran

Langage C

codes portables et 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 multidimensionnels et
fonctions associes (cf. matlab et scilab)

MNI

14

2015-2016

1 Introduction

Fortran et C

1.5 Intrts respectifs du C et du fortran

Exemple : appel une procdure de la bibliothque LAPACK


pour 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 par mot-clef

MNI

15

2015-2016

1 Introduction

Fortran et C

1.6 Format des instructions

1.6 Format des instructions


langage C
libre

langage Fortran
format du code

libre du fortran 90
fixe en fortran 77

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


une instruction
se termine par
instruction simple ;

la fin de la ligne

instruction compose }

entre /* et */
peut stendre sur plusieurs lignes

//
en C99 et C++
distinction

sauf si & la fin

dlimiteurs de
commentaire
introducteur de
commentaire
fin de la ligne
maj/minuscule

!
pas de distinction

lignes de directives pour le prprocesseur : # en premire colonne

MNI

16

2015-2016

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 <stdio.h>
/* instructions prprocesseur
#include <stdlib.h>
/* pas de ";" en fin
/* fonction principale
int main(void)
{
/*
<<= dbut du corps
int i ;
/*
dclarations
int s=0 ;
/*
initialisation
for (i = 1 ; i <= 5 ; i++)
{
/*
<<= dbut de bloc
s += i ;
}
/*
<<= fin de bloc
printf("somme des entiers de 1 5\n") ;
printf("somme = %d\n", s) ; /*
affichage
exit(0) ;
/* renvoie unix le status 0
}
/*
<<= fin du corps

MNI

17

*/
*/
*/
*/
*/
*/
*/
*/
*/
*/
*/

2015-2016

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
! << 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

2 Types et dclarations des variables

Fortran et C

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 :
les entiers reprsents exactement
les rels reprsents approximativement en virgule flottante

B ne jamais compter avec des rels


2.1.1 Domaine des entiers signs
Exemple introductif des entiers sur 1 octet (8 bits) : 28

taille
1 octet
MNI

= 256 valeurs possibles

non signs

signs

0 255 = 28 1

27 = 128 +127 = 27 1
19

2015-2016

2 Types et dclarations des variables

+28 1

+0

Fortran et C

2.1 Reprsentation des nombres : domaine (range) et prcision

+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

Entiers positifs sur 8 bits

Entiers relatifs sur 8 bits


Discontinuit en bas entre +127 et 128

Discontinuit en haut gauche de 0

Pour passer des positifs aux relatifs, on soustrait 28 dans la partie gauche du cercle.

MNI

20

2015-2016

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 : log10 2

0, 30

210 = 1024 = 1010 log10 (2) 103


fortran

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

B 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

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 en virgule flottante pour concilier dynamique et prcision
Par exemple en 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
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

2 Types et dclarations des variables

Fortran et C

2.1 Reprsentation des nombres : domaine (range) et prcision

En binaire, nombre de bits rparti entre mantisse (partie fractionnaire) et exposant

m bits de mantisse prcision limite

q bits de l exposant domaine fini


Ajouter 1 bit de signe nombre de bits = m + q + 1

exposant (puissance de 2) fix : progression arithmtique dans 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 6 = 1/2m
Flottants sur 32 bits : m

= 23 bits de mantisse = 223 106 /8

Octaves en progression gomtrique de raison 2

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


Flottants sur 32 bits : q = 8 bits dexposant donc 254 octaves
Domaine : MAX 1/MIN 2127 1,7 1038

MNI

23

2015-2016

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 q de lexposant


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

2
+0

1/4

MIN

1/2

+1

+2

+4

chelle log

MAX
une octave (n valeurs)
chelle linaire ( exposant fix)

Domaine des flottants positifs normaliss ( chelle log )

MNI

24

2015-2016

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 en progression arithmtique de pas X = X/n = X


2

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

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

MNI

25

2015-2016

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

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

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 de bits de |x| si entier, de sa mantisse si rel

PRECISION(x)

nombre de chiffres (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 jusqu 10r
kr = SELECTED_REAL_KIND(p,r) pour les rels
pour un domaine de 10r 10r et une prcision 10p (p chiffres significatifs)

MNI

27

2015-2016

2 Types et dclarations des variables

Fortran et C

2.2 Types de base

2.2 Types de base


Types reprsents exactement

MNI

langage C

Type

////C99 bool

boolen

char

caractre

////(tableau de char)

chane de caractres

short int

entier court

int

entier par dfaut

long int

entier long

C99 long

entier long long

long

fortran 90

logical

character(len=1)
character(len=....)
integer(kind=2)
integer
integer(kind=4/8)

28

integer(kind=8)

2015-2016

2 Types et dclarations des variables

Fortran et C

2.2 Types de base

Types reprsents approximativement


en virgule flottante : mantisse et exposant

MNI

langage C

Type

fortran 90

float

rel simple prcision (32 bits)

double

double prcision (64 bits)

double precision

long double

prcision tendue (> 80)

real(kind=10/16)

////C99 complex

complexe

#include <tgmath>

+ variantes

29

real

complex

2015-2016

2 Types et dclarations des variables

Fortran et C

2.3 Les constantes

2.3 Les constantes


langage C

C99

///// C99 : true (6= 0)

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

double prcision long

///// sauf I C99 :

2.3-I*.5

complexe

rel simple prcision


double prcision

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

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
Dclarer une 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...
Initialiser une variable = lui affecter une valeur lors de la rservation de la mmoire
Dclarations en tte des procdures : obligatoire en fortran et conseill en C89
En C99 : dclarations tardives autorises mais prfrer en tte de bloc

MNI

31

2015-2016

2 Types et dclarations des variables

langage C >

Fortran et C

2.4 Dclarations des variables

89

en tte des blocs

fortran >
C99 Nimporte o

90

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

int i = 2 ; (excution)

integer :: i = 2 (compilation)

Dclaration de constantes (non modifiables)

const int i = 2 ;
penser aussi #define

MNI

integer, parameter :: i = 2
VAR 2

utilisable comme une vraie constante

32

2015-2016

3 Oprateurs

Fortran et C

Oprateurs

3.1 Oprateur daffectation


B Laffectation = peut provoquer une conversion implicite de 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 conversions explicites

MNI

langage C

fortran

lvalue = (type) expression

variable = type (expression)

conversion force (oprateur cast)

grce des fonctions intrinsques

entier = (int) flottant;

entier = INT(flottant)

33

2015-2016

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));
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

3.2 Oprateurs algbriques

3.2 Oprateurs algbriques

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

3.3 Oprateurs de comparaison

3.3 Oprateurs de comparaison

MNI

langage C

fortran 90

rsultat

entier

boolen

infrieur

<

<

infrieur ou gal

<=

<=

gal

==

==

suprieur ou gal

>=

>=

suprieur

>

>

diffrent de

!=

/=

36

mais = pour affectation

2015-2016

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 6=

0),
mais le type boolen (bool) existe en C99, avec stdbool.h.

MNI

37

2015-2016

3 Oprateurs

Fortran et C

3.5 Incrmentation et dcrmentation en C

3.5 Incrmentation et dcrmentation en C


post-incrmentation et post-dcrmentation

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


aprs valuation de lexpression

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


p=2; n=p--; donne n=2 et p=1
pr-incrmentation et pr-dcrmentation

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


avant valuation de lexpression

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


p=2; n=--p; donne n=1 et p=1
B i = i++; indtermin !

MNI

38

2015-2016

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 :

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 :

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

MNI

39

2015-2016

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

sizeof(type)

size_t n1; double a;


n1 = sizeof a;

size_t n2;
n2 = sizeof(int);

3.9

Oprateur squentiel , en C

expr1 , expr2 permet dvaluer successivement les expressions expr1 et 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

3 Oprateurs

3.11

Fortran et C

3.11 Priorits des oprateurs en C

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 Entres et sorties standard lmentaires

Fortran et C

Entres et sorties standard lmentaires

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);

chaque variable (gabarit optionnel)

mais on peut prciser

spcifier \n en sortie

forcer par / dans le format

pour changer de ligne

changement denregistrement chaque


ordre READ ou WRITE

MNI

42

2015-2016

4 Entres et sorties standard lmentaires

Fortran et C

4.1 Introduction aux formats dentresortie

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
%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

4 Entres et sorties standard lmentaires

Fortran et C

4.1 Introduction aux formats dentresortie

#include <stdio.h> /* entres sorties standard */


#include <stdlib.h>
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 et y = %g\n", x, y);
exit(EXIT_SUCCESS);
}

MNI

44

2015-2016

4 Entres et sorties standard lmentaires

Fortran et C

4.1 Introduction aux formats dentresortie

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

END PROGRAM read_write

MNI

45

2015-2016

4 Entres et sorties standard lmentaires

Fortran et C

4.1 Introduction aux formats dentresortie

4.1.1 Introduction aux formats en C


Attention : quelques diffrences entre scanf (type exact)
et printf (conversion de 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
long double
MNI

(%e, %f) %g

(%Le, %Lf) %Lg


46

2015-2016

4 Entres et sorties standard lmentaires

Fortran et C

4.1 Introduction aux formats dentresortie

En entre avec scanf

MNI

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

47

2015-2016

5 Structures de contrle

Fortran et C

Structures de contrle

Par dfaut, excution squentielle des instructions une seule fois,


dans lordre spcifi par le programme.

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, ...)

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


Nommage possible des structures en fortran (utile pour les branchements)

MNI

48

2015-2016

5 Structures de contrle

5.1 Structure conditionnelle if

Fortran et C

Structure conditionnelle if

5.1

Condition if

5.1.1

c
if

fortran 90

FAUSSE

condition

if (expression) instruction

if (expr. log.) instruction

if (expression) {

if (expr. log.) then

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

5.1 Structure conditionnelle if

Fortran et C

Alternative if ... else

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

5.1 Structure conditionnelle if

Exemples dalternative if ... else

#include <stdio.h> /* fichier if2.c */


#include <stdlib.h>
int main(void)
{
/* structure
if ... else
*/
int i, j, max ;
printf("entrer i et j (entiers)\n") ;
scanf("%d %d", &i, &j) ;
if (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

! 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

5.1 Structure conditionnelle if

Fortran et C

Alternatives imbriques if ... else

Imbrication simple deux niveaux

VRAIE

if

Fusion des retours un niveau

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

Aplatissement de limbrication avec else

Structures imbriques deux

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

5.1 Structure conditionnelle if

Fortran et C

54

end if

! structure avec ELSE IF


IF (i < -10) THEN
WRITE(*,*) "i < -10"
! ELSEIF sur une mme ligne
ELSE IF (i < 10) THEN
WRITE(*,*) "-10<=i<10"
ELSE
WRITE(*,*) "i >= 10 "
END IF
! un seul END IF

2015-2016

5 Structures de contrle

5.2 Aiguillage avec switch/case

Fortran et C

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


c

fortran 90

switch ( expr. entire) {


case slecteur1 :
bloc dinstructions
[break ;]
case slecteur2 :
bloc dinstructions
[break ;]
...
default :
bloc dinstructions
}

select case (expr.)


case (slecteur1 )
bloc dinstructions
case (slecteur2)
bloc dinstructions
...
case default
bloc dinstructions
end select
slecteur

expression constante entire ou caractre

expression constante entire ou caractre


ou liste
ou intervalle fini ou semi-infini,

Sans break, 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

5.2.1 Exemples daiguillage case

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

5.2 Aiguillage avec switch/case

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

5.2 Aiguillage avec switch/case

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

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

5.3 Structures itratives ou boucles


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

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

5.3 Structures itratives ou boucles

fortran 90

for (expr1 ; expr2 ; expr3 )


bloc dinstructions

}
while (expr. )
instruction

boucle
(avec compteur
en fortran)
tant que
faire

}
do {
instruction
} while (expr. ) ;

do entier = dbut, fin[, pas]


bloc dinstructions
end do
do while (expr. log.)
bloc dinstructions
end do

faire ...
tant que

Boucle for

expr1 value une fois avant 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

5.3.1 Exemples de boucle for ou do

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

5.3 Structures itratives ou boucles

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

5.4 Branchements ou sauts


c
continue ;
break ;
goto tiquette; a

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

5.4 Branchements ou sauts

Rebouclage anticip

Sortie anticipe de boucle

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

5.4 Branchements ou sauts

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 pair
WRITE(*,*) i
END DO
MNI

66

2015-2016

5 Structures de contrle

Fortran et C

5.4 Branchements ou sauts

5.4.2 Exemples de sortie anticipe de boucle via break/exit

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

6 Introduction aux pointeurs

Fortran et C

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 : action indirecte sur une variable

crer ou supprimer des variables lors de lexcution : allocation dynamique


diffrences notables entre pointeurs en C et en fortran
indispensables en C

absents en fortran 77,

pour les arguments des fonctions

mais introduits en fortran 90/95

et les tableaux dynamiques

et tendus en fortran 2003

stockent des adresses des variables

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

6.2 Pointeurs et variables : exemple du C


Dclarer une variable dun type donn =
rserver une zone mmoire dont
la taille (sizeof en C) dpend du type
et le codage est fix par le type

sizeof (short int)

sizeof (float)

short int i ;

&i
MNI

float x ;
octet

adresse

&x
69

2015-2016

6 Introduction aux pointeurs

Fortran et C

6.2 Pointeurs et variables : exemple du C

Affecter une valeur une variable dun type donn =


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

sizeof (short int)

sizeof (float)

i=10 ;

00

&i

MNI

0A

x=10.f ;

octet

41

adresse

&x

70

20

00

00

2015-2016

6 Introduction aux pointeurs

Fortran et C

6.2 Pointeurs et variables : exemple du C

Dclarer une variable pointeur vers un type donn =


rserver une zone mmoire pour stocker des adresses
de variables de ce type : les pointeurs sont typs

leur type indique la taille et le codage de la cible potentielle

pti

ptx

sizeof (short int*)

sizeof (float*)

short int *pti ;

float *ptx ;

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

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 pointeur pti pointe sur la variable i,
la variable i est la cible du pointeur pti.
Attention :
il faut que les variables cibles i et x aient t dclares au pralable.
comme pour une variable ordinaire, ladresse contenue dans le pointeur est
indtermine avant laffectation du pointeur

initialiser un pointeur avant de le manipuler


Affecter la valeur dun pointeur pty un pointeur de mme 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

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

sizeof (short int)

sizeof (float)

short int i ;

float x ;

octet

&i

&x

adresse

pti= &i;

ptx= &x;

pti

MNI

ptx
sizeof (short int*)

sizeof (float*)

short int *pti ;

float *ptx ;
73

2015-2016

6 Introduction aux pointeurs

Fortran et C

Aprs avoir fait

pt = & x;

6.2 Pointeurs et variables : exemple du C

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

6 Introduction aux pointeurs

Fortran et C

Aprs avoir fait

pt = & y;

6.2 Pointeurs et variables : exemple du C

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

6 Introduction aux pointeurs

Fortran et C

6.2 Pointeurs et variables : exemple du C

6.2.2 Indirection (oprateur en C)


Loprateur * dindirection permet daccder la variable pointe via 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 de mme 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

Opration dindirection (*) sur un pointeur =


accs aux variables cibles
sizeof (short int)

sizeof (float)

short int i ;

float x ;

octet

&i

MNI

adresse

&x

*pti

*ptx

&i

&x

sizeof (short int*)

sizeof (float*)

short int *pti ;

float *ptx ;

77

2015-2016

6 Introduction aux pointeurs

Fortran et C

6.3 Pointeurs en fortran

6.3 Pointeurs en fortran


Notion plus haut niveau quen C : pas daccs aux adresses !
Pointeur considr comme un alias de la cible : le pointeur dsigne la cible

pas doprateur dindirection


Pas de type pointeur : pointer est un simple attribut dune variable
Association dun pointeur une cible par loprateur =>
Exemple : ptx

=> x

signifie ptx pointe vers x

Dsassociation dun pointeur

ptx => null() ou

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

6 Introduction aux pointeurs

Fortran et C

6.4 Syntaxe des pointeurs (C et fortran)

6.4 Syntaxe des pointeurs (C et fortran)

Langage C

type *ptr;
type *ptr=NULL;
type var; (pas dattribut)
ptr = &var ;
*ptr
ptr = NULL ;

Fortran 90
dclaration
avec initialisation

MNI

type, pointer :: ptr=>null()

cible

type, target (ncessaire) :: var

pointer sur

ptr => var (associer ptr var)

variable pointe par

ptr

dissocier

nullify(ptr); ptr=>null()

associ ?

associated(ptr)

la cible var ?

B concerne les adresses !

type, pointer :: ptr

ptr2 = ptr1

79

associated(ptr, var)
concerne les cibles !

2015-2016

6 Introduction aux pointeurs

Fortran et C

6.5 Exemples lmentaires (C et fortran)

6.5 Exemples lmentaires (C et fortran)


/* usage lmentaire dun pointeur */
#include <stdio.h>
#include <stdlib.h>
int main(void){
int i=1, j=2;
int *pi = NULL; // initialis
pi = &i; // pi devient ladresse de lentier i
printf("%d\n", *pi) ;
// affiche i
pi = &j; // pi devient ladresse de lentier j
// affiche j
printf("%d\n", *pi) ;
*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)

PROGRAM pointeur ! usage lmentaire dun pointeur


IMPLICIT NONE
INTEGER, TARGET :: i, j ! target obligatoire pour pointer vers
INTEGER, 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= ", pi
END PROGRAM pointeur

MNI

81

2015-2016

6 Introduction aux pointeurs

Fortran et C

6.6 Initialiser les pointeurs !

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 !

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

PROGRAM erreur_pointeur
IMPLICIT NONE
INTEGER, TARGET
:: i, j

Fortran et C

6.6 Initialiser les pointeurs !

! 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, " pi = ", pi
pi = 10 * pi ! on modifie en fait la cible pointe par pi
WRITE(*,*) "aprs pi=10*pi : i= ", i, " j= ", j, " pi = ", 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, " pi = ", pi
END PROGRAM erreur_pointeur

MNI

84

2015-2016

Das könnte Ihnen auch gefallen