これを行う方法は、Fortran側でFortranISOCバインディングを使用することです。これはFortran2003言語標準の一部であり、多くのコンパイラーで使用できます。gccに固有のものではありません。このサイトの多くの回答で説明されています。言語標準の一部として、コンパイラとプラットフォームに依存しません。また、コンパイラの内部受け渡し規則について知る必要はありません。ISO Cバインディングは、Fortranサブルーチンまたは関数の宣言で使用されると、FortranコンパイラーにC呼び出し規則を使用させ、そのプロシージャーをCから直接呼び出すことができるようにします。非表示の引数を追加したり、名前をマングルしたりする必要はありません。 Fortranサブルーチン名、つまり下線なし。リンカが使用する名前は、「bind」オプションに由来します。
文字列は、技術的にはCでは文字の配列であり、Fortranではこれと一致する必要があるため、難しいケースです。また、文字列のさまざまな定義に対処する必要があります。Cはnullで終了し、Fortranは固定長で、空白が埋め込まれます。この例は、これがどのように機能するかを示しています。数字は簡単です。配列に関する唯一の問題は、Cが行優先で、Fortran列優先であるため、多次元配列が転置されることです。
int main ( void ) {
char test [10] = "abcd";
myfortsub (test);
return 0;
}
と
subroutine myfortsub ( input_string ) bind ( C, name="myfortsub" )
use iso_c_binding, only: C_CHAR, c_null_char
implicit none
character (kind=c_char, len=1), dimension (10), intent (in) :: input_string
character (len=10) :: regular_string
integer :: i
regular_string = " "
loop_string: do i=1, 10
if ( input_string (i) == c_null_char ) then
exit loop_string
else
regular_string (i:i) = input_string (i)
end if
end do loop_string
write (*, *) ">", trim (regular_string), "<", len_trim (regular_string)
return
end subroutine myfortsub
Cをオブジェクトファイルにコンパイルし、gfortranを使用してFortranをコンパイルし、両方をリンクします。
gcc-mp-4.6 \
-c \
test_fortsub.c
gfortran-mp-4.6 \
test_fortsub.o \
myfortsub.f90 \
-o test_fortsub.exe
出力は次のとおりです。
>abcd< 4