将递归C结构移植到Fortran

时间:2013-03-18 18:40:00

标签: c struct interop fortran fortran-iso-c-binding

在Fortran中定义这个递归C结构的正确方法是什么?

struct OPTION {
        char option;
        char *arg;
        struct OPTION *next;
        struct OPTION *previous;
};

我写过这个Fortran代码:

module resources
use iso_c_binding
implicit none
   type :: OPTION
      character(c_char) :: option
      character(c_char) :: arg
      type(OPTION), pointer :: next
      type(OPTION), pointer :: previous
   end type OPTION
end module resources

这是编译,但我认为这是错误的,因为缺少类型定义中的bind(c)。如果我尝试使用type, bind(c) :: OPTION gfortran blames Error: Component 'next' at (1) cannot have the POINTER attribute because it is a member of the BIND(C) derived type 'option' at (2)

如果我保留type, bind(c) :: OPTION并删除POINTER属性,我会Error: Component at (1) must have the POINTER attribute

2 个答案:

答案 0 :(得分:0)

尝试:

   type, bind(c) :: OPTION
      character(c_char) :: option
      character(c_char) :: arg
      type(c_ptr) :: next
      type(c_ptr) :: previous
   end type OPTION
Fortran中的C指针实际上并不被视为指针,而是完全独立的类型。你必须通过C_F_POINTER将它们转换为Fortran指针才能最大限度地利用它们。

答案 1 :(得分:0)

您可以通过type(c_ptr)类型使用C类型指针:

module resources
  use iso_c_binding
  implicit none
  type, bind(c) :: OPTION
    character(c_char) :: option
    character(c_char) :: arg
    type(c_ptr) :: next
    type(c_ptr) :: previous
  end type OPTION
end module resources