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 de fonction qui ne compile pas. Pourquoi ?


Sujet :

Fortran

  1. #1
    Membre du Club
    Homme Profil pro
    Inscrit en
    Août 2011
    Messages
    49
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Loire (Rhône Alpes)

    Informations professionnelles :
    Secteur : Service public

    Informations forums :
    Inscription : Août 2011
    Messages : 49
    Points : 50
    Points
    50
    Par défaut Interface de fonction qui ne compile pas. Pourquoi ?
    Bonjour,

    Alors voici mon problème. Je définis une interface pour une fonction à l'intérieur d'un module ainsi:

    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
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
     
     
    module utils
     
      use blablabla1
      use blablabla2
     
      implicit none
     
      contains
     
      [plusieurs fonctions et sous-routines]
     
    interface
     
       function convert2matrX(tab)
         real,dimension(:,:,:,:,16):: tab
         real,dimension(:,:,:,:,4,4):: conv_scat
     
         [... instruction 1 ...]
     
       end function convert2matrX
     
       function convert2matrX(tab)
         real,dimension(:,:,7):: tab
         real,dimension(:,:,4,4):: conv_ext
     
         [...instructions 2...]
     
       end function convert2matrX
     
    end interface
    Cette fonction transforme une liste de 7 ou ben 16 nombre en une matrice 4x4. Bien sur les instructions ne sont pas les même selon la taille de la liste, j'ai donc opté pour cette solution d'une interface avec 2 fonctions à l'intérieur.

    Cependant, il semblerait que g95 n'aime pas beaucoup car j'ai le droit à:

    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
     
    In file utils.f90:573
     
    interface
             1
    Error: Unexpected INTERFACE statement in CONTAINS section at (1)
    In file utils.f90:579
     
         real,dimension(:,:,:,:,16):: tab
                                  1
    Error: Bad specification for deferred shape array at (1)
    In file utils.f90:580
     
         real,dimension(:,:,:,:,4,4):: conv_scat
                                   1
    Pourquoi ce problème? L,interface est-elle mal déclarée? Me conseillez-vous une autre solution (par exemple un case dans la fonction) qui serait plus rapide à l'exécution (car cette fonction risque d'être utilisée de nombreuses fois) ?

    merci beaucoup pour votre précieuse aide

  2. #2
    Membre du Club
    Homme Profil pro
    Inscrit en
    Août 2011
    Messages
    49
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Loire (Rhône Alpes)

    Informations professionnelles :
    Secteur : Service public

    Informations forums :
    Inscription : Août 2011
    Messages : 49
    Points : 50
    Points
    50
    Par défaut
    Alors pour le problème de "Error: Bad specification for deferred shape array", j'ai trouvé la solution.

    je ne spécifie pas le tableau et je le met en allocatable, puis je l'alloue dans la fonction ainsi:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
     
       function convert2matrX(tab)
         implicit none
         real,dimension(:,:,:,:,16),intent(in):: tab
         real,allocatable,dimension(:,:,:,:,:,:):: convert2matrX
         integer::sz
     
         allocate(convert2matrX(size(tab(:,1,1,1,1)),size(tab(1,:,1,1,1)),&
              size(tab(1,1,:,1,1)),size(tab(1,1,1,:,1)),4,4))
     
         ... instructions ...
     
       end function convert2matrX

    Cependant le problème avec la structure "interface" demeure... Je ne sais pas comment faire pour que le compilateur en veuille...

  3. #3
    Membre du Club
    Homme Profil pro
    Inscrit en
    Août 2011
    Messages
    49
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Loire (Rhône Alpes)

    Informations professionnelles :
    Secteur : Service public

    Informations forums :
    Inscription : Août 2011
    Messages : 49
    Points : 50
    Points
    50
    Par défaut
    J'ai également essayé de bouger tout le module interface plus haut dans le module, avant CONTAINS.

    Désormais j'ai l'erreur suivant lorsque j'essaie de récupérées les données des différents tableaux:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
           conv16(:,:,:,:,1,:)=tab(:,:,:,:,1:4)
                                               1
    Error: Unexpected assignment statement at (1) in INTERFACE body
    où conv16 est la fonction chargée les listes de 16 chiffres et donc qui renvoie un tableau (:,:,:,:,4,4) et tab, est la liste de valeurs en entrée...

    faut-il que j'utilise plutôt une subroutine ? d'où vient le pb ?

  4. #4
    Membre habitué
    Homme Profil pro
    Ingénieur modélisation aérodynamique
    Inscrit en
    Juillet 2009
    Messages
    105
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur modélisation aérodynamique
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Juillet 2009
    Messages : 105
    Points : 128
    Points
    128
    Par défaut
    Bonjour,

    Si tu veux utiliser une interface regroupant tes deux fonctions, ces deux fonctions doivent avoir un nom différent dans l'interface. La syntaxe suivante devrai mieux marcher :

    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
    22
    23
     
    module utils
     
       use blabla1
       use blabla 2
     
       implicit none
     
    !  Déclaration de l'interface avec un nom générique
    !  ------------------------------------------------
       interface convert2matriX
     
          function convert2matriX_num1 (...)
             ! Déclarations et instructions
          end function convert2matriX
     
          function convert2matriX_num2 (...)
             ! Déclarations et instructions
          end function convert2matriX
     
       end interface convert2matriX
     
    end module utils
    Puis dans ton programme principal, tu utilise le nom de l'interface comme une fonction :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    program main
       use utils
       implicit none
     
       convert2matriX(...)
    end

  5. #5
    Membre du Club
    Homme Profil pro
    Inscrit en
    Août 2011
    Messages
    49
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Loire (Rhône Alpes)

    Informations professionnelles :
    Secteur : Service public

    Informations forums :
    Inscription : Août 2011
    Messages : 49
    Points : 50
    Points
    50
    Par défaut
    @bobbyboy

    Non ce n'est pas ça. j'y aie bien sûr pensé et j,ai modifié le code en conséquence mais l'erreur est toujours la même...

    Peut-être cela vient-il du fait que des fonctions ne peuvent pas renvoyer de tabeaux? Je ne vois pas sinon...

    J'ai bougé hors de du bloc "CONTAINS", j'ai changé les noms des fonctions, j'ai fait en sorte qu'elles soient parfaitement définies et qu'il n'y aie pas de "ALLOCATE" à l'interrieur (ce qui apparemment n'est pas possible). Bref... je ne sais plus...

  6. #6
    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
    la ligne :

    ! déclarations et instructions

    dans les interfaces, ça contient quoi ?

  7. #7
    Membre du Club
    Homme Profil pro
    Inscrit en
    Août 2011
    Messages
    49
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Loire (Rhône Alpes)

    Informations professionnelles :
    Secteur : Service public

    Informations forums :
    Inscription : Août 2011
    Messages : 49
    Points : 50
    Points
    50
    Par défaut
    Le code se présente comme ça en entier:

    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
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
     
    module utils
     
      use machin
      use truc
      use bidule
     
      implicit none
     
    !************************************************************
     
      interface convert2matrX
         ! this function transform the list read in 4x4 matrix
     
         function conv16(tab)
           !convert diffusion matrix size: 16
           implicit none
           real,dimension(nphio,ntheo,nphii,nthei,16),intent(in):: tab
           real,dimension(nphio,ntheo,nphii,nthei,4,4):: conv16
           integer::sz
     
           conv16(:,:,:,:,1,:)=tab(:,:,:,:,1:4)
           conv16(:,:,:,:,2,:)=tab(:,:,:,:,5:8)
           conv16(:,:,:,:,3,:)=tab(:,:,:,:,9:12)
           conv16(:,:,:,:,4,:)=tab(:,:,:,:,13:16)
         end function conv16
     
         function conv7(tab)
           !convert extinction matrix size: 7
           implicit none
           real,dimension(nphii,nthei,7),intent(in):: tab
           real,dimension(nphii,nthei,4,4):: conv7
           integer::sz
     
           conv7(:,:,1,:)=tab(:,:,1:4)
           conv7(:,:,2,3:4)=tab(:,:,5:6)
           conv7(:,:,3,4)=tab(:,:,6)
           conv7(:,:,2,2)=tab(:,:,1)
           conv7(:,:,3,3)=tab(:,:,1)
           conv7(:,:,4,4)=tab(:,:,1)
           conv7(:,:,2:4,:)=conv7(:,:,:,2:4)
           conv7(:,:,3,2)=-conv7(:,:,2,3)
           conv7(:,:,4,2:3)=-conv7(:,:,2:3,4)
     
         end function conv7
      end interface
     
      CONTAINS
     
      ... autres fonctions ...
     
    end module utils

  8. #8
    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
    Il y a confusion ici.

    Il y a plusieurs utilisations à l'instruction interface. Tu peux :
    • définir une fonction générique
    • définir la fonction à appeler pour résoudre un opérateur ou une assignation
    • définir comment appeler une fonction (liste et types des arguments).

    La 3ième utilisation est automatiquement générée par le compilateur à la compilation d'un module (l'interface est stockée dans le fichier .mod). Une interface, ça sert à dire au compilateur, lors de la compilation du code client (code utilisant une fonction) comment appeler la fonction. Ce n'est pas le code de la fonction, c'est uniquement comment l'appeler.

    Dans ton cas, tu semble vouloir définir une fonction générique (convert2matrX) implantée en conv16 ou conv7 selon que l'argument est de rang 5 ou 3.

    Tu dois donc avoir :
    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
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
     
    module utils
     
      use machin
      use truc
      use bidule
     
      implicit none
     
      interface convert2matrX
        module procedure conv16
        module procedure conv7
      end interface
     
      CONTAINS
     
         ! this function transform the list read in 4x4 matrix
     
         function conv16(tab)
           !convert diffusion matrix size: 16
           implicit none
           real,dimension(nphio,ntheo,nphii,nthei,16),intent(in):: tab
     
    !? d'où viennent nphio,ntheo,nphii,nthei ? D'un des use ?
     
           real,dimension(nphio,ntheo,nphii,nthei,4,4):: conv16
           integer::sz
     
           conv16(:,:,:,:,1,:)=tab(:,:,:,:,1:4)
           conv16(:,:,:,:,2,:)=tab(:,:,:,:,5:8)
           conv16(:,:,:,:,3,:)=tab(:,:,:,:,9:12)
           conv16(:,:,:,:,4,:)=tab(:,:,:,:,13:16)
         end function conv16
     
         function conv7(tab)
           !convert extinction matrix size: 7
           implicit none
           real,dimension(nphii,nthei,7),intent(in):: tab
           real,dimension(nphii,nthei,4,4):: conv7
           integer::sz
     
           conv7(:,:,1,:)=tab(:,:,1:4)
           conv7(:,:,2,3:4)=tab(:,:,5:6)
           conv7(:,:,3,4)=tab(:,:,6)
           conv7(:,:,2,2)=tab(:,:,1)
           conv7(:,:,3,3)=tab(:,:,1)
           conv7(:,:,4,4)=tab(:,:,1)
           conv7(:,:,2:4,:)=conv7(:,:,:,2:4)
           conv7(:,:,3,2)=-conv7(:,:,2,3)
           conv7(:,:,4,2:3)=-conv7(:,:,2:3,4)
     
         end function conv7
     
      ... autres fonctions ...
     
    end module utils

  9. #9
    Membre habitué
    Homme Profil pro
    Ingénieur modélisation aérodynamique
    Inscrit en
    Juillet 2009
    Messages
    105
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur modélisation aérodynamique
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Juillet 2009
    Messages : 105
    Points : 128
    Points
    128
    Par défaut
    Bonjour,

    la ligne :

    ! déclarations et instructions

    dans les interfaces, ça contient quoi ?
    Désolé c'est une erreur, je pensais qu'on pouvais définir les fonction directement dans le bloc de l'interface, mais non.

Discussions similaires

  1. Fonction qui ne marche pas sous FireFox
    Par Foudébois dans le forum Général JavaScript
    Réponses: 8
    Dernier message: 17/11/2006, 14h35
  2. exemple qui ne compile pas
    Par Edta dans le forum AWT/Swing
    Réponses: 10
    Dernier message: 01/11/2006, 13h58
  3. sscanf - syntaxe qui ne compile pas
    Par xilebo dans le forum C
    Réponses: 4
    Dernier message: 12/09/2006, 13h41
  4. [C# 2.0] Un exemple de classe générique qui ne compile pas.
    Par Pierre8r dans le forum Windows Forms
    Réponses: 4
    Dernier message: 31/05/2006, 11h11
  5. Réponses: 5
    Dernier message: 18/05/2006, 12h06

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