インテル® Fortran コンパイラー XE 13.1 ユーザー・リファレンス・ガイド
C 言語には文字列はありません。代わりに、単一文字の配列があります。そのため、Fortran では同じように文字列を表す必要があります。
C の char 型に対応する KIND 値、C_CHAR があります。 ただし、長さ 1 の文字変数のみ互換性があります。
次の例は、文字列を C ルーチンに渡す Fortran プログラムと、新しい文字列で Fortran ルーチンを呼び出す C ルーチンを示します。
Fortran プログラム:
program demo_character_interop use, intrinsic :: iso_c_binding implicit none interface subroutine c_append (string) bind(C) character, dimension(*), intent(in) :: string end subroutine c_append end interface ! 通常の文字値を渡す C ルーチン ! この文字値をデフォルトの種類の単一文字の ! 配列に一致させる call c_append('Intel Fortran'//C_NULL_CHAR) end program demo_character_interop subroutine fort_print (string) bind(C) use, intrinsic :: iso_c_binding implicit none ! "互換性" があるように単一文字の配列として ! 引数を宣言する必要がある character, dimension(100), intent(in) :: string integer s_len ! 文字列の長さ character(100), pointer :: string1 character(100) :: string2 ! 配列を文字変数に変換 call C_F_POINTER(C_LOC(string),string1) s_len = INDEX(string1,C_NULL_CHAR) - 1 print *, string1(1:s_len) ! 別の方法で変換 string2 = TRANSFER(string,string2) ! ソース長 < 100 の場合ガベージを移動 s_len = INDEX(string2,C_NULL_CHAR) - 1 print *, string2(1:s_len) end subroutine fort_print
C ルーチン:
C module (c_append.c): #include <string.h> extern void fort_print(char * string); /* Fortran ルーチン */ void c_append (char * string) { char mystring[100]; strcpy(mystring, string); strcat(mystring, " interoperates with C"); /* 新しい文字列を渡す Fortran ルーチンを呼び出す */ fort_print (mystring); return; }