Publicité
+ Répondre à la discussion
Affichage des résultats 1 à 5 sur 5
  1. #1
    Membre habitué
    Profil pro
    Inscrit en
    septembre 2004
    Messages
    110
    Détails du profil
    Informations personnelles :
    Âge : 31
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : septembre 2004
    Messages : 110
    Points : 110
    Points
    110

    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.

  2. #2
    Modérateur

    Profil pro
    Inscrit en
    août 2006
    Messages
    840
    Détails du profil
    Informations personnelles :
    Localisation : Canada

    Informations forums :
    Inscription : août 2006
    Messages : 840
    Points : 1 079
    Points
    1 079

    Par défaut

    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.

  3. #3
    Membre habitué
    Profil pro
    Inscrit en
    septembre 2004
    Messages
    110
    Détails du profil
    Informations personnelles :
    Âge : 31
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : septembre 2004
    Messages : 110
    Points : 110
    Points
    110

    Par défaut

    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!

  4. #4
    Modérateur

    Profil pro
    Inscrit en
    août 2006
    Messages
    840
    Détails du profil
    Informations personnelles :
    Localisation : Canada

    Informations forums :
    Inscription : août 2006
    Messages : 840
    Points : 1 079
    Points
    1 079

    Par défaut

    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.

  5. #5
    Membre habitué
    Profil pro
    Inscrit en
    septembre 2004
    Messages
    110
    Détails du profil
    Informations personnelles :
    Âge : 31
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : septembre 2004
    Messages : 110
    Points : 110
    Points
    110

    Par défaut

    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!

+ Répondre à la discussion
Cette discussion est résolue.

Liens sociaux

Règles de messages

  • Vous ne pouvez pas créer de nouvelles discussions
  • Vous ne pouvez pas envoyer des réponses
  • Vous ne pouvez pas envoyer des pièces jointes
  • Vous ne pouvez pas modifier vos messages
  •