2014-10-28 2 views
1

У меня есть мой Fortran объект т.е.Передача FORTRAN объекта в C и наоборот

this%object%a 

this%object%b 

this%object%c 

Я хочу передать его в код, написанный на C, я преимущественно фортрановский программист и у меня было очень мало воздействия C. Я использую iso_c_binding для передачи целых чисел и массивов, но теперь мне нужно передать объекты.

Я определяю объект следующим образом

TYPE object 

     INTEGER         :: a 

     INTEGER         :: b 

     INTEGER         :: c 

    END TYPE object 
+0

Как объявлен ваш объект Fortran? Кроме того, ваш вопрос отмечен fortran90, но IIRC ISO_C_BINDING является функцией Fortran 2003 (в настоящее время поддерживается Intel Fortran и другими) – deStrangis

+0

Вы знаете C structs? Как выглядят ваши типы Fortran? Некоторые из них могут быть совместимы, некоторые не могут. @deStrangis исправлено. –

+0

Какой тип FORTRAN мне нужен? @deStrangis – Matty

ответ

4

Вы можете сделать совместимые типы:

use iso_c_binding 

TYPE, BIND(C) :: object 

    INTEGER(c_int)        :: a 

    INTEGER(c_int)        :: b 

    INTEGER(c_int)        :: c 

END TYPE object 

type(object) :: o 

Существуют ограничения в стандарте на объекте. Например, он не может содержать выделенные или указательные компоненты.

Когда вы передаете его интероперабельной процедуры:

void sub(c_object* x){} 

subroutine sub(x) bind(C,name="sub") 
    type(object), intent(inout) :: x 
end subroutine 

call sub(o) 

он совместим с C структуры

typedef struct { 
    int a; 
    int b; 
    int c; 
} c_object; 

Вы также можете пройти без интероперабельные типа С, но вы должны использовать указатели:

subroutine sub2(x) bind(C,name="sub") 
    type(c_ptr), value :: x 
end subroutine 

call sub2(loc(o)) 
+0

Спасибо, большое спасибо – Matty

Смежные вопросы