0

在 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) :: OPTIONgfortran 归咎于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

4

2 回答 2

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 指针并不真正被视为指针,而是被视为完全独立的类型。您必须将它们转换为 Fortran 指针C_F_POINTER才能充分利用它们。

于 2013-03-18T20:14:37.097 回答
0

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

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
于 2013-03-18T20:14:37.730 回答