如何有一个Fortran函数与不同类型的参数使用c_ptr?



我阅读了文章Fortran最佳实践中的回调中的类型转换

我想在我的程序中使用如中描述的东西使用类型(c_ptr)指针

但是我有一个问题。我给出了我要做的事情的大纲。我希望这足以让你理解。否则,让我知道,我会发布一个完整的例子。

我有两种类型,我用一种或另一种类型调用同一子例程。子例程的第一个参数是一个整数,用于指示第二个参数的类型(type1_t或type2_t)

type type1_t
real :: a, b
integer :: c
end type1_t
type type2_t
real :: a,e
integer :: b,c,d
end type2_t
type(type1_t) :: type1 
! ... init of type1
type(type2_t) :: type2 
! ... init of type2_t
call myfoo(1,c_loc(type_1))
call myfoo(2,c_loc(type_2))

但是现在,我对myfoo中的声明有一个问题,因为声明必须在指令之前用fortran完成。

我知道下面的代码不能工作:

subroutine myfoo(i, params) 
integer, intent(in) :: i
type(c_ptr), intent(in) :: params

if (i == 1) then 
type(type1_t), pointer :: pars
elseif (i ==2) then
type(type2_t), pointer :: pars
endif

call c_f_pointer(params, pars)
! do some stuff with pars (there are common parts of code either the dummy args is type_1 or type_2). For example, the line above.
end subroutine myfoo

如果我使用一个块结构,我将有一个问题,因为变量在块的末尾消失了。

我如何使用c_ptr解决它?

实现此目的的一个简单方法是将特定类型的代码放在模块中的两个独立例程中,并使用接口将它们绑定,这样编译器将根据输入时提供的变量类型选择正确的子例程:

module blabla
private
public :: foo
interface foo
module procedure foo1
module procedure foo2
end interface 
contains
subroutine foo1(params)
type(t1) :: params
! Do cool stuff
end subroutine foo1
subroutine foo2(params)
type(t2) :: params
! Do type-2 cool stuff here
end subroutine foo2
end module blabla

相关内容

  • 没有找到相关文章

最新更新