ISO_C_Binding을 이용한 Fortran-C 브리지의 문자열 배열
-
13-12-2019 - |
문제
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]);
}
}
. 제휴하지 않습니다 StackOverflow