我想從C傳遞一個字符串數組到Fortran子程序以及從Fortran到同一個Fortran子例程。我成功地從C和Fortran傳遞了單個字符串(即1D字符數組)。但是,我遇到了字符串數組的麻煩。我在Fortran方面使用ISO C綁定,理想情況下,我希望在呼叫方儘可能無縫。如何將C和Fortran中的字符串數組傳遞給Fortran?
我看過一些相關的問題和答案。有些(即this和this)僅僅是「使用ISO C」而沒有進一步的細節,這沒有多大幫助。 This answer非常有幫助(類似於a different question的答案),但僅適用於單個字符串,其中看起來c_null_char在單個Fortran字符串中被識別。如果沒有兩個單獨的例程,我無法弄清楚爲數組情況做些什麼。
我現在已經是一個C程序,我想傳遞一個字符串從數組(string
):
#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語言做了,我得到了廢話:
[email protected],B�@(P,B�]B]6(P,B�@ .......
似乎有在這個方法沒有c_null_char
。
所以,我怎麼能寫一個Fortran子程序採取從兩個C和Fortran字符串數組?
這種方法的問題是,它需要兩個獨立的功能。我希望能從C和Fortran中獲得同樣好的功能(想象一個應該獨立於代碼的庫)。 –