次の Fortran サブルーチンがあるとします。
subroutine f_test(n,x,value)
use iso_c_binding
implicit none
integer, intent(in) :: n
real(kind=8), intent(in) :: x(n)
real(kind=8), intent(out) :: value
integer(kind=c_int) :: n_
real(kind=c_double) :: value_,x_(n)
n_ = transfer( n, n_ )
x(1:n) = transfer( x(1:n), x_(1:n) )
call c_test(n_,x_,value_)
value = transfer( value_, value )
end subroutine f_test
また、これc_test
は、ベクトルに対して機能し、結果を変数x
に返すC ルーチンへのポインターであるとします。value
これは完全に機能しますが、それについて質問があります。
ベクトルの変換はx
、サブルーチンを呼び出すアルゴリズムの複雑さに劇的な影響を与える可能性がありますf_test
。つまり、そのようなアルゴリズムが時間を呼び出す場合、アルゴリズムf_test
n
の複雑さは 2 次になりますが、この変換がなければ単純に線形になります。したがって、この方法で行われるこの変換は実際的ではありません。この問題を回避する合理的な方法はありますか?