Fortran forme générale d’une déclaration

Forme générale d’une déclaration

type[, liste_attributs ::] liste_objets
Différents types :
* real
* integer
* double precision
* complex
* character
* logical
* type

Différents attributs :

parameter
dimension
allocatable
pointer
target
save
intent
optional
constante symbolique
taille d’un tableau
objet dynamique
objet défini comme pointeur
objet accessible par pointeur (cible)
objet statique
vocation d’un argument muet
argument muet facultatif
public ou private visibilité d’un objet défini dans un module external ou intrinsic nature d’une procédure
Exemple :
integer :: nbre, cumul
real :: x, y, z
integer, save :: compteur
integer, parameter :: n = 5
double precision a(100) ! Non recommandé double precision, dimension(100) :: a complex, dimension(-2:4, 0:5) :: c
real, pointer :: ptr

Types dérivés (i)

Structure de données regroupant des données (composantes) hétérogènes.
1. Définition des types dérivés :
TYPE Personne
CHARACTER(LEN=20) :: nom
INTEGER :: age
REAL :: taille
END TYPE Personne
2. Déclaration (attribut TYPE) :
TYPE(Personne) :: ind1, ind2, ind3, ind4
3. Initialisation via un constructeur de structure (du même nom que le type créé) :
ind1 = Personne( ‘Durand’, 45, 1.70 )
ind2 = Personne( ‘Dupont’, 30, 1.64 )
Affectation et manipulation :
ind3 = ind2 ! Possible car opérateur = ! sur-défini par la norme 90
ind4 = ind2 + ind3 ! Illicite
Accès à un champ : l’opérateur « %“ :
ind1%nom ! Durand
ind2%age ! 30
Opérations sur les composantes :
INTEGER :: somme
somme = ind1%age + ind2%age

Structures de contrôle (i) : boucles DO

Principales nouveautés :
1. Possibilité de nommer les boucles
[étiquette:] DO [contrôle de boucle] bloc
END DO [étiquette]
2. Boucles DO sans contrôle de boucle (condition + EXIT pour en sortir)
do read(*, *) nombre
if (nombre == 0) EXIT somme = somme + nombre
end do
3. Instruction CYCLE
(abandonne le traitement de l’itération courante) do
read(*, *, iostat=eof)x if (eof /= 0) EXIT if (x <= 0.) CYCLE
y = log(x)
end do
Exemple
integer :: n
……..
SELECT CASE(n)
CASE(0) ! n=0
print *, ‘ il est nul‘
CASE(1, 2) ! n=1 ou 2
print *, ‘ il est petit‘
CASE(3:10) ! 3 <= n <= 10
print *, ‘ il est moyen‘
CASE(11:) ! n <= 11
print *, ‘ il est grand‘
CASE DEFAULT ! autres cas
print *, ‘ il est négatif‘
END SELECT
Tableaux : définitions

Déclaration d’un tableau : attribut DIMENSION

• Etendue d’un tableau dans une dimension = nombre d’éléments dans cette dimension.
• Profil d’un tableau = vecteur dont chaque élément est l’étendue du tableau dans la dimension correspondante.
Deux tableaux sont conformants s’ils ont le même profil.
Exemple :
real, dimension(-5:4,0:2) :: x
real, dimension(0:9,-1:1) :: y
L’étendue des tableaux x et y est 10 dans la 1ère dimension et 3 dans la 2ème.
Ils ont même profil : le vecteur (/ 10, 3 /),
⇒ ils sont conformants.
Tableaux : initialisation
Possibilité d’initialiser un tableau 1D au moment de sa déclaration ou lors d’une instruction d’affectation au moyen de constructeur de tableaux.
• Pour les tableaux de rang supérieur à 1 on utilisera la fonction RESHAPE que nous verrons plus loin.
• Constructeur de tableau : vecteur de scalaires dont les valeurs sont encadrées par les caractères (/ et /).
Exemple :
integer, dimension(4) :: t1, t2,
integer :: i
t1 = (/ 6, 5, 10, 1 /)
t2 = (/ (i*i, i=1,4) /)
Rq ; utilisation de boucles implicites possible.

Tableaux : manipulation

F90 permet de manipuler globalement l’ensemble des éléments d’un tableau (en fait, plusieurs opérateurs ont été sur-définis afin d’accepter des objets de type tableau comme opérande).
Important : les tableaux intervenant dans une expression doivent être conformants.
Exemple :
real, real,
dimension(6,7) :: a, b
dimension(2:7,5:11) :: c
b = 1.5 ! possible car un scalaire est
! supposé conformant à tout tableau
c = b
a = (b * c) + 4.0
Remarque :
Ici l’opérateur * est une multiplication terme à terme (différent de MATMUL)

Cours gratuitTélécharger le cours complet

Télécharger aussi :

Laisser un commentaire

Votre adresse e-mail ne sera pas publiée. Les champs obligatoires sont indiqués avec *