我试图从C调用FORTRAN函数
我的问题是:
如果fortRoutine是我的fortran子程序的名称,那么我从C中调用它fortRoutine_.如果fortRoutine只包含一个字符数组参数,那么我可以像这样传递:
fortRoutine_("I am in fortran");
Run Code Online (Sandbox Code Playgroud)在调用FORTRAN子例程时,何时应该使用pass by值和何时通过引用传递?
由于我是C的新手,我对此并不了解.如果可能的话,请提供一些很好的教程链接.
我正在使用一个旧的 Fortran 库,它需要一个字符标量PATH作为子例程的参数。原来的界面是:
SUBROUTINE MINIMAL(VAR1, ..., PATH)
CHARACTER (LEN=4096) PATH
...
Run Code Online (Sandbox Code Playgroud)
我需要能够从 C++ 调用它,因此我进行了以下更改:
SUBROUTINE MINIMAL(VAR1, ..., PATH) &
BIND (C, NAME="minimal_f")
USE ISO_C_BINDING, ONLY: C_CHAR, C_NULL_CHAR
CHARACTER (KIND=C_CHAR, LEN=1), DIMENSION(4096), INTENT(IN) :: PATH
CHARACTER (LEN=4096):: new_path
! Converting C char array to Fortran CHARACTER.
new_path = " "
loop_string: do i=1, 4096
if ( PATH (i) == c_null_char ) then
exit loop_string
else
new_path (i:i) = PATH (i)
end if
end do loop_string
Run Code Online (Sandbox Code Playgroud)
根据这个答案。这可以将 C …
我试图将字符串数组从C传递到Fortran子例程,以及从Fortran传递到相同的Fortran子例程。我已经成功地从C和Fortran中成功传递了单个字符串(即1D字符数组)。但是,我在处理字符串数组时遇到了麻烦。我在Fortran端使用ISO C绑定,理想情况下,我希望在调用端尽可能做到无缝。
我已经阅读了一些相关的问题和答案。有些(即this和this)只是“使用ISO C”而没有更多细节,这并没有太大帮助。这个答案非常有帮助(对不同问题的类似答案),但是仅适用于单个字符串,其中似乎在单个Fortran字符串中识别了c_null_char。如果没有两个单独的例程,我无法弄清楚数组情况该怎么办。
我现在有一个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;
}
Run Code Online (Sandbox Code Playgroud)
并且,一个类似的Fortran例程:
program main
implicit none
call print_hi_array( (/"asdf", "ghji", "zxcv"/) )
end program
Run Code Online (Sandbox Code Playgroud)
到目前为止,这是我对接收端的要求:
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 …Run Code Online (Sandbox Code Playgroud)