通过C函数(II)定义的Fortran派生类型构造函数

时间:2016-12-22 08:28:32

标签: c binding fortran

在问题Fortran derived type constructor defined though C function之后,我找到了这个非工作的例子,gfortran 4.9:

module my_module
  use iso_c_binding
  type, bind(c) :: my_double
     real(c_double) :: x
     real(c_double) :: y
  end type my_double
  interface my_double
      procedure my_module_fortran_new_my_double
  end interface
  interface
     type(my_double) function my_module_fortran_new_my_double (v) bind ( c )
       use iso_c_binding
       import :: my_double
       real (c_double), intent(in) :: v
     end function my_module_fortran_new_my_double
  end interface
end module my_module

program main
  use my_module
  type(my_double) x
  x = my_double(12)
end program main

按照上一个问题Fortran derived type constructor defined though C function,模块定义正常。但是,我的编译器无法识别定义的构造函数。

这是编译器输出:

$ gfortran -std=f2008 test.f90 -o test.o -c
test.f90:22.6:

  x = my_double(12)
      1
Error: No initializer for component 'y' given in the structure constructor at (1)!

这似乎不考虑我使用的定义构造函数。有人能帮助我理解我做错了吗(再次)?

1 个答案:

答案 0 :(得分:3)

要匹配的特定构造函数

my_double(12)

必须有一个带接口的程序

type(my_double) function something(i, ...) ...
   integer ... :: i
   ..., optional, ... :: ...
end function

因为给定的单一组件来源是integer类型。

提供的唯一非默认特定构造函数是具有一个real(c_double)类型的非可选组件源的构造函数。

要解决,有两种方法:

  • 添加一个采用默认整数的特定过程;或
  • 为非默认构造函数指定适当的参数。

对于后者:

x = my_double(12._c_double)   ! c_double from intrinsic iso_c_binding

值得注意的是为什么会出现这个问题。你可能会高兴地尝试

x = my_double(12,13)  ! Using the normal constructor
x = my_double(12)     ! Using the normal constructor if default
                      ! initialization applies for component y

与隐含的构造函数一样,源项(遵循内在赋值的规则)转换为组件本身的类型/参数。这种转换不适用于解决泛型的问题。