ISO_C_BINDINGを使用したFORTRAN-Cブリッジの文字列の配列
-
13-12-2019 - |
質問
FortranのC相互運用性メカニズムを使用してFortranからC関数を呼び出すコードを書いています(FORTRAN 2003で導入され、新しいバージョンのgfortranとifortで実装されています)。
この答えは、ほとんど必要なものですが、私は私がどんなインタフェース宣言を中心にしてもらうことはできませんこのようなC関数のFORTRANで使用します。
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
.
私はヌル終了の問題に対処しなければならないことを知っています。
解決
それをする方法は、文字列を指すために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
.
とCENGESICETAGCODEをC関数に渡します。
C関数にはインタフェースがあります。
void stringFunc(int *numStrings, char **stringArray) {
int i;
for(i=0;i<*numStrings;++i) {
printf("%s\n",stringArray[i]);
}
}
. 所属していません StackOverflow