문제

Fortran의 C 상호 운용성 메커니즘을 사용하여 Fortran에서 C 함수를 호출하는 코드를 작성하고 (Fortran 2003에서 도입되어 새로운 버전의 GFortran 및 IFORT)에서 구현되었습니다.

이 답변 는 거의 필요로하는 거의 이지만, 어떤 인터페이스 선언을하는지 주위에 내 머리를 얻을 수는 없습니다.Fortran에서 다음과 같이 보이는 C 함수에 사용하십시오.

int use_array(int n, char * array[]){
    int i;
    for(i=0; i<n; i++){
        printf("Item %d = %s\n",i,array[i]);
    }
    return n;
}
.

나는 Fortran End의 인터페이스에 대한 선언이 무엇인지 분명하지 않습니다.

interface
    function use_array(n, x) bind(C)
        use iso_c_binding
        integer (c_int) use_array
        integer (c_int), value :: n
        character(c_char) WHAT_SHOULD_GO_HERE? :: x
    end function use_array
end interface
.

NULL 종결 문제를 다루어야 할 것입니다.

도움이 되었습니까?

해결책

우리가하는 방식은 C_PTR 배열을 사용하여 문자열을 가리키는 것입니다.예 :

CHARACTER(LEN=100), DIMENSION(numStrings), TARGET :: stringArray
TYPE(C_PTR), DIMENSION(numStrings) :: stringPtrs
.

다음은 stringArray에서 문자열을 설정하고 다음과 같이 널로 종료하는 것을 기억합니다 :

DO ns = 1, numStrings
   stringArray(ns) = "My String"//C_NULL_CHAR
   stringPtrs(ns) = C_LOC(stringArray(ns))
END DO
.

및 CENERACODICETAG 코드를 C 함수에 전달합니다.

C 함수에는 인터페이스가 있습니다 :

void stringFunc(int *numStrings, char **stringArray) {
    int i;
    for(i=0;i<*numStrings;++i) {
       printf("%s\n",stringArray[i]);
    }
 }
.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top