2014-02-25 2 views
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 코디네이터.

+4

호출 규칙에 따라 플랫폼에서 수행 할 C 선언의 _stdcall은 무엇입니까? 어떻게 그것이 포트란 인터페이스에 반영 되었습니까? (확실하지 않습니다)'! GCC $ ATTRIBUTES STDCALL :: GRBnewmodel'이 필요할 것입니다. 문자 내장 타입에 대한 첫 번째 타입 매개 변수는 길이가 아니라 종류라는 점에 유의하십시오. -'CHARACTER (C_CHAR)'는'CHARACTER (KIND = C_CHAR)'이어야합니다. 인터페이스 내부에서'REAL (8)'을'REAL (C_DOUBLE) '로 만들 수도 있습니다. – IanH

답변

0

올바른 호출 규칙을 찾았습니다.
나는이 github repository에 글을 올렸습니다.

관련 문제