2017-12-13 18 views
1

char*[] (문자열 배열)을 허용하는 C/C++ DLL을 만들고 배열의 값을 변경 한 다음 돌아옵니다. Fortran에서 C/C++ DLL로 문자열 배열을 전달하고 변경된 값으로 배열을 가져옵니다.

내 C/C++ 구현 :

포트란 (사용 ifort) 나는이 같은 DLL의 함수를 호출 오전에
int doubleijk_(char* data[]) // what should be the return type ??? 
{ 
    // code to change array elements 

    return 0; 
} 

: 나는 포트란에서 문자열, 정수를 통과 할 수 있어요

module variables 
    type string 
    character(len=:), allocatable :: str 
    end type string 
end module variables 


program Call_CPP 
    use variables 
    type(string) :: array(3) 
    array = [string('xyza'), string('abcd'), string('mnopqrs')] 

    INTERFACE 
! How to write SUBROUTINE for array 

     SUBROUTINE doubleijk_(arr) BIND(C,NAME='doubleijk_') 

!???????WHAT SHOULD BE SUBROUTINE FOR ARRAY OF STRINGS???????? 

     END SUBROUTINE doubleijk_ 

    END INTERFACE 

    ! Body of Call_CPP 

    call doubleijk_(array) 

! print values of array after call 

    end program Call_CPP 

및 C/C++에서 값이 변경되었습니다. 내가 필요한 건 Fortran에서 C/C++로 문자열 배열을 전달하고 변경된 값으로 배열을 되 찾는 것입니다. 어떻게해야합니까?

+0

당신은 포트란에 "문자열 배열"이 없습니다. 'string'이라는 파생 된 타입의 배열을 가지고 있습니다. – francescalus

+0

@francescalus 달성 가능한가 ?? 배열을 전달하는 올바른 방법은 무엇입니까 ?? – techie

+1

[이 질문] (https://stackoverflow.com/q/9686532/3157076)을 보았습니까? – francescalus

답변

0

마침내 그렇게했습니다. 여기에 해결책이 있습니다.

program Call_CPP 
use iso_c_binding, only: c_associated, c_loc, c_ptr 

    INTERFACE 
     SUBROUTINE doubleijk_(stringPtrs) BIND(C,NAME='doubleijk_') 
     use iso_c_binding  
     TYPE(C_PTR), DIMENSION(3) :: stringPtrs 

     END SUBROUTINE doubleijk_ 

    END INTERFACE 

    TYPE(C_PTR), DIMENSION(3) :: stringPtr 
    CHARACTER(LEN=20), DIMENSION(3), TARGET :: stringArray 
     DO ns = 1, 3 
      stringArray(ns) = "My String"//char(0) 
      stringPtr(ns) = c_loc(stringArray(ns)) 
     END DO 

    ! Body of Call_CPP 

    call doubleijk_(stringPtr) !Call C function 

    DO ns = 1, 3 
      print *, stringArray(ns) !print array after call-changed values 
    END DO 

    end program Call_CPP