0
Fortran에서 C로 함수를 호출하려고합니다.
C 포인터를 Fortran 유형으로 변환하는 방법을 잘 이해하지 못합니다.
어쩌면 이것이 세분화 오류의 원인 일 수 있습니다.
아래 코드는 제 코드입니다.Fortran에서 C를 호출 할 때 세그먼트 오류가 발생했습니다.
내 포트란 인터페이스가 맞습니까?
내 포트란 프로그램이 올바른 데이터 유형을 사용합니까?
C 함수 프로토 타입 (I 코드가없는)
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 &
)
gfortran과 MAC 코디네이터.
호출 규칙에 따라 플랫폼에서 수행 할 C 선언의 _stdcall은 무엇입니까? 어떻게 그것이 포트란 인터페이스에 반영 되었습니까? (확실하지 않습니다)'! GCC $ ATTRIBUTES STDCALL :: GRBnewmodel'이 필요할 것입니다. 문자 내장 타입에 대한 첫 번째 타입 매개 변수는 길이가 아니라 종류라는 점에 유의하십시오. -'CHARACTER (C_CHAR)'는'CHARACTER (KIND = C_CHAR)'이어야합니다. 인터페이스 내부에서'REAL (8)'을'REAL (C_DOUBLE) '로 만들 수도 있습니다. – IanH