Ошибка сегментации при вызове C из Фортрана
Я пытаюсь вызвать функцию в C из Fortran.
Я не очень хорошо понимаю, как перевести указатель C на типы Fortran.
Может быть, это источник ошибки сегментации.
Ниже мой код.
Является ли мой интерфейс Fortran правильным?
Использует ли моя программа на Фортране правильные типы данных?
Прототип функции C (у меня нет кода)
int __stdcall GRBnewmodel(
GRBenv *env,
GRBmodel **modelP,
const char *Pname,
int numvars,
double *obj,
double *lb,
double *ub,
char *vtype,
char **varnames
);
Интерфейс Фортран
function GRBnewmodel(env, modelP, Pname, numvars,obj, lb, ub, vtype, varnames) bind(C, name = 'GRBnewmodel' )
use iso_c_binding
integer(c_int) :: GRBnewmodel
type(c_ptr), value :: env
type(c_ptr) :: modelP
character(c_char), dimension(*) :: Pname
integer(c_int), value :: numvars
real(8), dimension(*):: obj
real(8), dimension(*) :: lb
real(8), dimension(*) :: ub
character(c_char), dimension(*) :: vtype
type(c_ptr) :: varnames ! character**
end function
Программа Фортран
type(c_ptr) :: env = c_null_ptr
type(c_ptr) :: modelP = c_nul_ptr
integer :: error
real(8), dimension(10) :: obj
real(8), dimension(10) :: lb
real(8), dimension(10) :: ub
character(c_char), dimension(10) :: vtype
integer :: i
error = GRBloadenv(env, 'gurobi.log'//c_null_char)
obj = 0
lb = 0
ub = 1
vtype = [ ('C', i=1,10) ]
! segmentation fault is on this line
error = GRBnewmodel( &
env, &
modelP, &
c_null_char, &
10, &
obj, &
lb, &
ub, &
vtype, &
c_null_ptr &
)
Я работаю над MAC Maverick с помощью Gfortran.
1 ответ
Решение
Я нашел правильное соглашение о вызовах.
Я разместил это в этом репозитории github.