Перенос рекурсивной структуры C на Fortran

Как правильно определить эту рекурсивную структуру C в Fortran?

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 обвинит 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.


person user2183564    schedule 18.03.2013    source источник


Ответы (2)


Пытаться:

   type, bind(c) :: OPTION
      character(c_char) :: option
      character(c_char) :: arg
      type(c_ptr) :: next
      type(c_ptr) :: previous
   end type OPTION

Указатели C в Fortran на самом деле рассматриваются не как указатели, а как совершенно отдельный тип. Вам придется преобразовать их в указатели Fortran на C_F_POINTER, чтобы получить от них максимальную пользу.

person none_00    schedule 18.03.2013

Вы можете использовать указатели 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
person Bálint Aradi    schedule 18.03.2013
comment
nextи previousявляются type OPTION не указателями, это моя проблема. - person user2183564; 19.03.2013
comment
С помощью type(c_ptr) вы можете отображать все C-указатели независимо от их типа. Однако, как отмечено в сообщении none_00, вам придется преобразовать их через C_F_POINTER, чтобы получить доступ к их полям. - person Bálint Aradi; 19.03.2013