Précédent   Forum du club des développeurs et IT Pro > Autres langages > Autres langages > Fortran
Fortran Forum d'entraide sur la programmation en Fortran. Avant de poster -> FAQ Fortran
Partagez cette discussion sur d'autres réseaux sociaux : Viadeo Twitter Google Facebook Digg Delicious MySpace Yahoo
Réponse
 
Outils de la discussion
Publicité
'
Vieux 19/09/2012, 16h33   #1
TheOyoStyledMan
Membre habitué
 
Inscription : septembre 2004
Messages : 111
Détails du profil
Informations personnelles :
Âge : 30
Localisation : France, Paris (Île de France)

Informations forums :
Inscription : septembre 2004
Messages : 111
Points : 118
Points : 118
Par défaut Interface générique et fonction size

Bonjour,

j'ai un petit problème dont voici un exemple simple:

Code :
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
module m_max
   interface xmax
        module procdedure dmax,zmax
   end interface xmax
contains
   subroutine dmax(v, max)
      implicit none
      double precision, dimension(*) :: v
      double precision :: max
      print*,size(v)
      [...]
   end subroutine dmax
   subroutine zmax(v, max)
      implicit none
      double complex, dimension(*) :: v
      double complex :: max
      print*,size(v)
      [...]
   end subroutine dmax
end module m_max
La fonction intrinsèque size ne fonctionne pas car l'interface n'est pas explicite (cf cours de l'IDRIS). Et bien entendu, j'ai une erreur à la compilation. Comment pourrais-je m'en sortir?

Merci d'avance pour vos conseils

PS: je précise que ceci est un exemple simple pour illustrer mon propos et que je ne cherche pas à faire une fonction max qui existe déjà en Fortran.
TheOyoStyledMan est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 19/09/2012, 17h52   #2
Sylvain Bergeron
Modérateur
 
Inscription : août 2006
Messages : 782
Détails du profil
Informations personnelles :
Localisation : Canada

Informations forums :
Inscription : août 2006
Messages : 782
Points : 1 029
Points : 1 029
Utilise dimension(:) et non dimension(*).

Au lieu de simplement passer un pointeur sur le premier élément du vecteur, le compilateur va plutôt passer une structure contenant les info sur le vecteur, dont la taille.
Sylvain Bergeron est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 20/09/2012, 10h50   #3
TheOyoStyledMan
Membre habitué
 
Inscription : septembre 2004
Messages : 111
Détails du profil
Informations personnelles :
Âge : 30
Localisation : France, Paris (Île de France)

Informations forums :
Inscription : septembre 2004
Messages : 111
Points : 118
Points : 118
Alors là, je viens d'apprendre un truc

C'est vrai que d'habitude, j'utilise dimension( : ) mais là j'avoue que j'ai fait un bête copier-coller. Mais même, je ne savais pas qu'il y avait une différence entre les deux écritures...

En tout cas, cela fonctionne, je te remercie!
TheOyoStyledMan est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 20/09/2012, 14h40   #4
Sylvain Bergeron
Modérateur
 
Inscription : août 2006
Messages : 782
Détails du profil
Informations personnelles :
Localisation : Canada

Informations forums :
Inscription : août 2006
Messages : 782
Points : 1 029
Points : 1 029
Comme je n'ai pas bien répondu à la question initiale, je vais compléter...

Tu n'avais pas de problème d'interface explicite. Le fait que tes fonctions étaient définies dans un module te garantissait qu'une interface explicite serait générée par le compilateur.

Si tu avais pu utiliser l'attribut dimension(*), tu n'aurais pas eu à besoin d'interface explicite parce que c'est le mode de passage d'argument par défaut (ça permet la compatibilité ascendante du Fortran 77).

L'interface explicite est requise si tu utilises des arguments avec des attributs introduit par Fortran 90 (dimention (:), optional, pointer, ...).

Une interface explicite est une interface qui est accessible au compilateur :
  • bloc interface
  • définition dans un module
  • fonction dans une section contains d'une autre fonction
Une interface implicite, c'est quand le compilateur n'a accès à aucune information sur la fonction appelée. Il suppose alors que c'est une fonction respectant la norme Fortran 77.
Sylvain Bergeron est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 21/09/2012, 09h46   #5
TheOyoStyledMan
Membre habitué
 
Inscription : septembre 2004
Messages : 111
Détails du profil
Informations personnelles :
Âge : 30
Localisation : France, Paris (Île de France)

Informations forums :
Inscription : septembre 2004
Messages : 111
Points : 118
Points : 118
Ok merci!

je pensais en fait que le fait de faire des interface génériques faisait que ce n'était des interfaces explicites et donc qu'il ne passait pas les informations du tableau. Mais j'ai un peu mieux compris maintenant!
TheOyoStyledMan est déconnecté   Envoyer un message privé Réponse avec citation 00
Réponse Cette discussion est résolue.
Outils de la discussion

Navigation rapide


Fuseau horaire GMT +2. Il est actuellement 05h55.


 
 
 
 
Partenaires

Hébergement Web