8 votes

Comment appeler une fonction interne à une sous-routine dans un module ?

J'ai un module qui contient une sous-routine qui, à son tour, contient une fonction. Je dis use themodule dans mon programme principal et je peux call thesubroutine Mais comment puis-je accéder à la fonction contenue dans la sous-routine ?

Le code se présente comme suit :

module useful
  integer, parameter :: N=2
  double precision, parameter :: xmin=1, xmax=10, pi=3.1415926535898
  double complex :: green(N,N), solution(N), k=(2.0,0.0)
contains
  subroutine y(n1)
  contains
    function x(n1)
      real :: n1, x
      x=n1*(xmax-xmin)/N
    end function x
  end subroutine y
end module useful

9voto

M. S. B. Points 19509

Vous ne devez pas contenir la fonction à l'intérieur de la sous-routine. La fonction doit être placée après la sous-routine. Le module doit contenir autant de procédures (sous-programmes et fonctions) que nécessaire. Commencez chacune d'entre elles par une déclaration de sous-programme ou de fonction et terminez-les par la déclaration de fin correspondante. Ne les imbriquez pas les unes dans les autres... mais plutôt l'une après l'autre. Ne conservez que l'instruction "module contains". Utilisez ensuite ce module à partir de votre programme principal ou d'une procédure extérieure au module.

Les sous-programmes et les fonctions du module sont également accessibles les uns aux autres. Il n'est pas nécessaire d'utiliser un "contains".

5voto

zmi Points 46

Quelques remarques supplémentaires. Vous pouvez placer la fonction à l'intérieur du sous-programme, si cette fonction n'est utilisée que par ce sous-programme. Dans ce cas, l'imbrication des fonctions est un concept utile.

Si vous voulez cacher certaines fonctions du module pour le programme externe (pour toujours), vous déclarez ces fonctions cachées comme privées dans votre module.

i.e

module useful
public y,x ! shall be accessible by "use useful" statement in external program 
private ! anything else declared in the module is hidden for external program
integer, parameter :: N=2
!...

contains

subroutine y(n1)

end subroutine y

function x(n1)

end function x

end module useful

l'utilisation de public et private vous permet d'éviter les erreurs de contamination de votre espace de noms en utilisant les déclarations

use useful, only: y,x

use useful2, only: x,y,z

use useful3, only: x2,x3,x4

4voto

arclight Points 499

Pour clarifier la réponse donnée par M. S. B., divisez votre code comme suit, en notant que la fonction x() a été extraite du sous-programme y() et qu'il n'y a qu'une seule instruction "contains" pour séparer les déclarations de variables au niveau du module des déclarations de fonctions/sous-programmes :

module useful

  integer, parameter :: N=2
  double precision, parameter :: xmin=1, xmax=10, pi=3.1415926535898
  double complex :: green(N,N), solution(N), k=(2.0,0.0)

contains

  subroutine y(n1)
    real :: n1
    ! Here you can do something like:
    ! print 'F8.3', x(n1) 
  end subroutine y

  function x(n1)
    real :: n1, x
    x=n1*(xmax-xmin)/N
  end function x

end module useful

Comme le souligne M. S. B., x() et y() sont dans la même portée, il n'y a donc rien de spécial à faire pour appeler x() à partir de y().

0voto

Albert S. Kim Points 1

Pour appeler la fonction x à partir de la sous-routine y , écrire

public :: x

(à droite) avant contains .

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X