2011-01-08 24 views
7

我有一個模塊,其中包含一個子程序,而該子程序又包含一個函數。我在我的主程序中說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 

回答

4

爲了闡明MSB給出的答案,請將代碼分解如下,注意函數x()是如何從子例程y()中提取的,並且只有一個'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 

由於MSB指出,X()和Y()是在相同的範圍所以沒有什麼特別的,你需要做的調用由Y X()()。

9

你不應該包含子例程中的功能。子程序後有功能。根據需要在模塊中安裝儘可能多的程序(子程序&函數)。用子程序或函數語句開始每個子程序,並用相應的結束語句結束它們。不要將它們嵌套在彼此之內......而是一個接一個。只有模塊包含語句。然後從主程序或模塊外的程序「使用」該模塊。

模塊中的子程序和功能也可以互相訪問。無需使用「包含」。

4

一些額外的評論。 如果只有該子程序使用該功能,則可以將該功能放入子程序中。在這種情況下,嵌套函數是一個有用的概念。

如果您想隱藏模塊中某些外部程序的功能(永遠),您可以將這些隱藏函數聲明爲模塊中的私有函數。使用公共和私人

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 

可以幫助你避免與命名空間的污染的錯誤使用語句

use useful, only: y,x 

use useful2, only: x,y,z 

use useful3, only: x2,x3,x4 
0

從子程序y調用函數x,寫

public :: x 

(右)be前contains

相關問題