IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Fortran Discussion :

Interface générique et fonction size


Sujet :

Fortran

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

    Informations forums :
    Inscription : Septembre 2004
    Messages : 110
    Points : 130
    Points
    130
    Par défaut Interface générique et fonction size
    Bonjour,

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

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    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
    974
    Détails du profil
    Informations personnelles :
    Localisation : Canada

    Informations forums :
    Inscription : Août 2006
    Messages : 974
    Points : 1 346
    Points
    1 346
    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 : 41
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Septembre 2004
    Messages : 110
    Points : 130
    Points
    130
    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
    974
    Détails du profil
    Informations personnelles :
    Localisation : Canada

    Informations forums :
    Inscription : Août 2006
    Messages : 974
    Points : 1 346
    Points
    1 346
    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 : 41
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Septembre 2004
    Messages : 110
    Points : 130
    Points
    130
    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.

Discussions similaires

  1. [AJAX] interface boucle retour fonction Ajax dans code Php
    Par sami117 dans le forum Général JavaScript
    Réponses: 2
    Dernier message: 24/02/2009, 19h41
  2. C# => VB.net classe, interface générique
    Par Gr@nd@x dans le forum VB.NET
    Réponses: 2
    Dernier message: 27/10/2008, 13h27
  3. Interface Flash pour fonction C
    Par carter15_2001 dans le forum Flash
    Réponses: 5
    Dernier message: 11/02/2008, 08h39
  4. Réponses: 3
    Dernier message: 22/03/2007, 07h19
  5. Réponses: 5
    Dernier message: 23/02/2006, 00h34

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo