У меня есть коммерческая библиотека C, которую я хочу использовать с Fortran. Есть две функции и структура указателя, например:
struct env;
typedef struct env *ENVptr;
две функции имеют прототип:
ENVptr open(int *status_p);
int close(ENVptr **env_p);
Я написал интерфейс Fortran для доступа к ним:
interface
function c_open(status) bind(c, name='c_open')
use, intrinsic :: iso_c_binding
integer(kind = c_int) :: status
type(c_ptr) :: c_open
end function
function c_close(env) bind(c, name='c_close')
use, intrinsic :: iso_c_binding
type(c_ptr) :: env
integer(kind = c_int) :: c_close
end function
end interface
Я использую этот код, чтобы использовать это в моей программе Fortran:
type(c_ptr) :: env = c_null_ptr
env = c_open(status)
if ( status .ne. 0 ) then
print *, 'Could not open environment'
stop
end if
...some more code...
if ( c_associated(env) ) then
status = c_close(env)
if ( status .ne. 0 ) then
print *, 'Could not close environment.'
end if
end if
но когда я выполняю программу, я получаю ошибку ошибки сегментации, когда программа достигает функции c_close
.
Это правильный способ взаимодействия с подпрограммами C?