文字列の配列を C から Fortran サブルーチンに、また Fortran から同じ Fortran サブルーチンに渡そうとしています。C と Fortran の両方から、単一の文字列 (つまり、1D 文字配列) を正常に渡すことができました。ただし、文字列の配列に問題があります。私は Fortran 側で ISO C バインディングを使用しています。理想的には、これを呼び出し側で可能な限りシームレスにしたいと考えています。
関連する質問と回答をいくつか読みました。いくつか (つまり、これとこれ) は、詳細がなく、単に「ISO C を使用する」だけであり、あまり役に立ちません。この回答は非常に役に立ちました (別の質問に対する同様の回答) が、c_null_char が単一の Fortran 文字列で認識されるように見える単一の文字列に対してのみ機能します。2 つの別個のルーチンがなければ、配列の場合に何をすべきかわかりません。
私が現在持っているのは、文字列の配列 ( string
)を渡したい C ルーチンです。
#include <iostream>
extern "C" void print_hi_array(char input_string[][255]);
using namespace std;
int main() {
char string[3][255] = {"asdf","ghji","zxcv"};
print_hi_array(string);
return 0;
}
そして、同様の Fortran ルーチン:
program main
implicit none
call print_hi_array( (/"asdf", "ghji", "zxcv"/) )
end program
これまでのところ、これは私が受信側のために持っているものです:
subroutine print_hi_array(input_string) bind(C)
use iso_c_binding, only: C_CHAR, c_null_char
implicit none
character (kind=c_char, len=1), dimension (3,255), intent (in) :: input_string
character (len=255), dimension (3) :: regular_string
character (len=255) :: dummy_string
integer :: i,j,k
write (*,*) input_string
do j = 1 , 3
dummy_string(:) = c_null_char
k = 1
do i = 1 + (j-1)*255, j*255,1
if (input_string(i) .ne. c_null_char) then
write (*,*) "i ",i,j, input_string(i)
dummy_string(k:k) = input_string(i)
endif
k = k +1
enddo
regular_string(j) = dummy_string
enddo
write (*,*) regular_string
end subroutine print_hi_array
これは C 関数で機能します。私はこの出力を得ます:
asdfghjizxcv
j= 1
i 1 1 a
i 2 1 s
i 3 1 d
i 4 1 f
j= 2
i 256 2 g
i 257 2 h
i 258 2 j
i 259 2 i
j= 3
i 511 3 z
i 512 3 x
i 513 3 c
i 514 3 v
asdf ghji zxcv
ただし、Fortran を使用して行うと、ナンセンスになります。
asdfghjizxcv@O,B�@(P,B�]B]6(P,B�@ .......
c_null_char
このアプローチにはないようです。
では、C と Fortran の両方から文字列の配列を取り込む Fortran サブルーチンを作成するにはどうすればよいでしょうか?