C から Fortran サブルーチンを呼び出そうとしていますが、C で割り当てて Fortran へのポインターを安全に渡すことはできますか? サブルーチン内の配列は自動配列 (x(nmax)) です。
(x を割り当ててから fortran に渡します)
C から Fortran サブルーチンを呼び出そうとしていますが、C で割り当てて Fortran へのポインターを安全に渡すことはできますか? サブルーチン内の配列は自動配列 (x(nmax)) です。
(x を割り当ててから fortran に渡します)
はい。最新の Fortran では、Fortran ルーチンを C から呼び出すことができ、その逆も可能であることが保証されています。これは、Fortran ISO_C_BINDING を介して行われます。これは Fortran 2003 の一部であり、Fortran 95 コンパイラの拡張機能として広く利用可能でした。gfortran マニュアル (「混合言語プログラミング」および「組み込みモジュール」の章) にドキュメントがあります。言語機能として、このドキュメントは gfortran コンパイラよりも役立ちます。fortran-iso-c-binding タグを介して見つけることができるスタックオーバーの例もここにあります。
簡単なコード例:
#include <stdio.h>
#include <stdlib.h>
void F_sub ( float * array_ptr );
int main ( void ) {
float * array_ptr;
array_ptr = malloc (8);
F_sub (array_ptr);
printf ( "Values are: %f %f\n", array_ptr [0], array_ptr [1] );
return 0;
}
と
subroutine F_sub ( array ) bind (C, name="F_sub")
use, intrinsic :: iso_c_binding
implicit none
real (c_float), dimension (2), intent (out) :: array
array = [ 2.5_c_float, 4.4_c_float ]
end subroutine F_sub
一般に、「はい」: C 配列を FORTRAN に渡すことができ、その逆も可能です。特に、両方のコンパイラが同じベンダーのものである場合 (たとえば、g77 プログラムから gcc 関数を呼び出す場合)。
2 つの適切なリンクを次に示します。