Oop 将对象从一个模块传递到另一个模块的子例程
我有两个模块文件mod1.f95和mod2.f95。Mod1有一些数学函数,比如rk4和插值方法,我一直试图保持它的通用性,以便我可以在其他项目中重用该模块。Mod2中定义了一个类结构Obj1,该类结构专门用于该项目。问题在于,mod1中定义的子例程现在需要一个对象定义,该对象定义沿着以下行传递Oop 将对象从一个模块传递到另一个模块的子例程,oop,object,fortran,gfortran,Oop,Object,Fortran,Gfortran,我有两个模块文件mod1.f95和mod2.f95。Mod1有一些数学函数,比如rk4和插值方法,我一直试图保持它的通用性,以便我可以在其他项目中重用该模块。Mod2中定义了一个类结构Obj1,该类结构专门用于该项目。问题在于,mod1中定义的子例程现在需要一个对象定义,该对象定义沿着以下行传递 subroutine driver(x1, x2, func, this) real(kind=8) :: x1, x2 external :: func, this ! thi
subroutine driver(x1, x2, func, this)
real(kind=8) :: x1, x2
external :: func, this ! this is the Object
! ...
end subroutine driver
我从中得到的错误是
Type mismatch in argument 'this' at (1); passed TYPE(Obj1) to UNKOWN
我有一种感觉,这会发生,因为external
关键字用于函数和子例程,但我想将一个对象传递给子例程,而无需将我的mod2硬编码到mod1(即使用使用mod2
)
我找不到零钱了
subroutine driver(x1, x2, func, this)
real(kind=8) :: x1, x2
class(Object) :: this
external :: func
! ...
end subroutine driver
但是(1)处的get派生类型“object”在定义之前正在使用
。
我还尝试了type(Object)::这个,产生了相同的错误
重申一下,我想看看是否有一种方法可以在“一般”意义上初始化一个对象,这样我创建的其他模块和文件就可以链接到这个mod1,而不必更改里面的代码。任何建议都将不胜感激 你为什么反对(正确的)使用mod2
?如果您想对对象
有一个可访问的定义,那么您没有太多的选择。如果你能解释一下你想用这个
做什么,我们也许可以提出一些建议。如果mod1
应该是通用的,那么在另一个模块中定义的对象“需要”被传递到mod1
?我发现分析有缺陷。你不能在mod2
(定义对象的地方)中编写一个例程,从对象的特定成员上调用mod1
中的例程吗?在子例程中,external::func
也恰好是类对象的一部分,因此它看起来类似于call func(this,x1,x2)
。我想我在想,在其他语言中,类是如何从一个总体对象类继承的,因为子程序驱动程序除了将对象传递给func
之外,实际上并不处理对象,其目标是传递使用Obj1(或一些变量,取决于mod1)的某个指定接口(例如,对于Runge Kutta)的函数作为内部数据?为什么反对(正确的)使用mod2
?如果您想对对象
有一个可访问的定义,那么您没有太多的选择。如果你能解释一下你想用这个
做什么,我们也许可以提出一些建议。如果mod1
应该是通用的,那么在另一个模块中定义的对象“需要”被传递到mod1
?我发现分析有缺陷。你不能在mod2
(定义对象的地方)中编写一个例程,从对象的特定成员上调用mod1
中的例程吗?在子例程中,external::func
也恰好是类对象的一部分,因此它看起来类似于call func(this,x1,x2)
。我想我在想,在其他语言中,类是如何从一个总体对象类继承的,因为子程序驱动程序除了将对象传递给func
之外,实际上并不处理对象,其目标是传递使用Obj1(或一些变量,取决于mod1)的某个指定接口(例如,对于Runge Kutta)的函数作为内部数据?