我试图从C调用FORTRAN函数
我的问题是:
如果fortRoutine
是我的fortran子程序的名称,那么我从C中调用它fortRoutine_
.如果fortRoutine
只包含一个字符数组参数,那么我可以像这样传递:
fortRoutine_("I am in fortran");
Run Code Online (Sandbox Code Playgroud)在调用FORTRAN子例程时,何时应该使用pass by值和何时通过引用传递?
由于我是C的新手,我对此并不了解.如果可能的话,请提供一些很好的教程链接.
我无法将char数组从c ++传递给fortran(f90).
这是我的c ++文件'cmain.cxx':
#include <iostream>
using namespace std;
extern "C" int ftest_( char (*string)[4] );
int main() {
char string[2][4];
strcpy(string[0],"abc");
strcpy(string[1],"xyz");
cout << "c++: string[0] = '" << string[0] << "'" << endl;
cout << "c++: string[1] = '" << string[1] << "'" << endl;
ftest_(string);
return 0;
}
Run Code Online (Sandbox Code Playgroud)
这是我的fortran文件'ftest.f90':
SUBROUTINE FTEST(string)
CHARACTER*3 string(2)
CHARACTER*3 expected(2)
data expected(1)/'abc'/
data expected(2)/'xyz'/
DO i=1,2
WRITE(6,10) i,string(i)
10 FORMAT("fortran: string(",i1,") = '", a, "'" )
IF(string(i).eq.expected(i)) THEN
WRITE(6,20) string(i),expected(i)
20 FORMAT("'",a,"' …
Run Code Online (Sandbox Code Playgroud) 我将一些遗留的 F77 代码(我无法更改)包装在 C 接口中。假设遗留代码有
subroutine foo(s, l)
character*10 s
logical l(10)
…
Run Code Online (Sandbox Code Playgroud)
我正在编写一个小的 F2008 包装器foo_wrapper
,它打算通过 公开与 C 兼容的接口ISO_C_BINDING
,进行任何必要的类型转换,调用foo
,最后再次进行类型转换。我的理解是我应该从
subroutine foo_wrapper(c_s, c_l) bind(C, name="foo_wrapper")
use ISO_C_BINDING, only: C_CHAR, C_BOOL
character(kind=C_CHAR, len=1), dimension(10) :: c_s
logical(kind=C_BOOL) c_l(10)
…
Run Code Online (Sandbox Code Playgroud)
但是我实际上如何进行从c_s
到 a的转换character*10
,同样为c_l
到 a logical
(并在调用后返回)?