如何调用模块中子程序内部的函数?

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了如何调用模块中子程序内部的函数?相关的知识,希望对你有一定的参考价值。

我有一个包含子程序的模块,该子程序又包含一个函数。我在我的主程序中说use themodule我可以call thesubroutine,但是如何访问子程序中包含的函数?

代码如下所示:

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
答案

为了澄清MSB给出的答案,请按如下方式拆分代码,注意如何从子例程y()中提取函数x(),并且只有一个'contains'语句将模块级变量声明与函数/子例程声明分开:

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

正如M. S. B.指出的那样,x()和y()在同一范围内,因此从y()调用x()不需要做任何特殊处理。

另一答案

您不应该在子例程中包含该函数。子程序后有功能。根据需要在模块中包含尽可能多的过程(子程序和函数)。使用子例程或函数语句启动每个子例程,并以相应的结束语句结束它们。不要把它们嵌在彼此里面......相反,一个接一个。只有模块包含声明。然后从主程序中“使用”该模块,或从模块外部的程序中“使用”该模块。

模块中的子程序和函数也可以相互访问。无需使用“包含”。

另一答案

一些额外的评论。如果此子函数仅使用此函数,则可以将该函数放在子例程中。在这种情况下,嵌套函数是一个有用的概念。

如果要隐藏外部程序模块中的某些功能(永远),则在模块中将这些隐藏功能声明为私有。

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

使用public和private可以帮助您避免因使用语句而污染命名空间而导致的错误

use useful, only: y,x

use useful2, only: x,y,z

use useful3, only: x2,x3,x4
另一答案

要从子程序x调用函数y,写

public :: x

(右)在contains之前。

以上是关于如何调用模块中子程序内部的函数?的主要内容,如果未能解决你的问题,请参考以下文章

如何将字符串数据从活动发送到片段?

VB中子程序或函数未定义是啥意思

易语言模块里的类命令怎么调用?

在 Activity 内部,如何暂停 for 循环以调用片段,然后在按钮单击片段后恢复循环以重新开始

微信小程序中子组件调用父组件的方法

如何有条件地将 C 代码片段编译到我的 Perl 模块?