在单独的模块中扩展派生类型而不更改类型的名称

时间:2014-06-02 13:59:12

标签: module fortran derived-types

我可以通过添加一个模块文件来扩展程序,在该文件中我扩展了最初定义的派生类型,例如eg。:

module mod1

   type type1
      real :: x
   end type

end module

module mod2       

   use mod1    
   type,extends(type1) :: type2
      contains
      procedure,pass :: g
   end type

contains

   function g(y,e)
      class(type2), intent(in) :: y
      real,intent(in) :: e 
      g=y%x+e
   end function

end module

program test

use mod2

type(type2) :: a

a%x=3e0
write(*,*) a%g(5e0)

end program

但是使用这个解决方案我需要在调用程序中更改'a'(type1-> type2)的声明,每次我添加另一个模块时。所以我的问题是,如果有办法解决这个问题,即我可以在另一个模块中为派生类型添加一个类型绑定过程而不更改该类型的原始名称。

我完全理解这可能不起作用,因为我可以随后声明一个变量并扩展它的类型,这对我来说听起来有问题。所以,我想到了延期陈述。但这并不是我想要的,因为我首先必须将它添加到原始定义中,然后我需要提供一个接口,因此需要知道后来的函数(这里是g)的变量。但是,也许有人有一个很好的解决方案。

所有这些当然是为了在程序中引入更多结构,特别是当我考虑同时处理一个程序的不同人员时,分割工作包的可能性似乎相当有用。

2 个答案:

答案 0 :(得分:1)

您可以使用USE语句的重命名功能重命名使用关联的实体。

MODULE m2
  USE m1, chicken => type1
  TYPE, EXTENDS(chicken) :: type1
  ...
模块type1中的

m2与模块type1中的m1的类型不同。

您也可以在主程序的USE语句中或通过某个中间模块重命名。

如果两个type1名称都可以在另一个范围内访问,并且您引用了名称type1,那么您的编译器会抱怨。

如果您使用此技巧并且其他程序员阅读您的代码,那么他们可能会抱怨。

答案 1 :(得分:1)

在某种程度上submodules会对您有所帮助,但它们是在最广泛使用的编译器中实现的。您可以将过程的实现推迟到子模块,但无论如何都必须指定接口。

据我所知,这是不可能的。