インテル® Fortran コンパイラー 18.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;
}