インテル® Fortran コンパイラー 17.0 デベロッパー・ガイドおよびリファレンス
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(len=1), 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(len=1), dimension(100), intent(in) :: string
integer s_len ! Length of string
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;
} |