我试图从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) 我正在编写一个小型的C++程序,它将一个二维数组(复数)传递给一个Fortran子程序,然后将它接收回来填充值.我写了一个通过并接收一维数组的版本,这很有效.2-D版本不起作用(我的真正目标是编写具有大尺寸的4-D版本 - 因此必须动态分配这些数组).
我将发布我的工作代码和非工作代码,但首先请注意我被迫使用结构(简单的,只包含两个双精度),因为Fortran似乎以与其自身的原始复数完全相同的方式解释它们.这就是我的1-D版本有效的原因.出于同样的原因,我不认为这是一个"复杂数字"的问题.
这是我的工作代码.将一维复数数组传递给Fortran子程序:
Fortran子程序:
subroutine carray(A)
complex*16 A(2)
A(1) = cmplx(3,7)
A(2) = cmplx(9,5)
return
end
Run Code Online (Sandbox Code Playgroud)
C++代码:
include <iostream>
include <complex>
using namespace std;
struct cpx{double r, i;};
extern"C"
{
void carray_(struct cpx* A);
}
int main()
{
struct cpx* A;
A = new struct cpx [2];
carray_(A);
complex<double>* P;
P = new complex<double> [2];
for(x = 0; x < 2; x++)
{
real(P[x] = A[x].r;
imag(P[x] = A[x].i;
}
cout << real(P[0]) << "\t" << imag(P[0]) << …Run Code Online (Sandbox Code Playgroud) 如何将C strings(char* cstrings[])数组传递给Fortran子例程?
问题使用iso_c_binding的fortran-C桥接器中的字符串数组肯定是相关的,但答案似乎不正确,甚至不能用GNU Fortran编译.
我目前正在为Fortran代码开发一个C接口,我预计iso_c_binding(我之前使用过的)会让这件事变得轻而易举.到目前为止C字符串数组没有运气......
Fortran子例程应该将一个字符串数组作为参数.在普通的Fortran中,我会写如下内容:
subroutine print_fstring_array(fstring)
implicit none
character(len=*), dimension(:), intent(in) :: fstring
integer :: i
do i = 1, size(fstring)
write(*,*) trim(fstring(i))
end do
end subroutine print_fstring_array
Run Code Online (Sandbox Code Playgroud)
将单个C字符串传递给Fortran的一种方法是作为C指针(c_ptr)(我知道,我也可以使用一个数组character(kind=c_char))
subroutine print_cstring(cstring) bind(C)
use iso_c_binding, only: c_ptr, c_f_pointer, c_loc, c_null_char
implicit none
type(c_ptr), target, intent(in) :: cstring
character(len=1024), pointer :: fstring
integer :: slen
call c_f_pointer(c_loc(cstring), fstring)
slen = index(fstring, c_null_char) - 1
write(*,*) fstring(1:slen)
end subroutine print_cstring …Run Code Online (Sandbox Code Playgroud) 我觉得这应该是一个简单的问题,但我无法让它发挥作用.我有一些Fortran代码,它接受如下输入:
SUBROUTINE TRACE(X,Y,NAME,XX,YY)
EXTERNAL NAME
CALL NAME(X,Y,XX,YY)
Run Code Online (Sandbox Code Playgroud)
我试图从以下形式传递C++的名称:
float x,y,xx,yy;
char * name="IGRF";
trace_(&x,&y,name,&xx,&yy);
Run Code Online (Sandbox Code Playgroud)
它编译,但当我尝试调用NAME子例程时,我总是得到段错误.在文件中定义了一个名为IGRF的子程序,我可以直接从C++调用IGRF子程序,但需要这个TRACE例程.在gdb中运行时,它表示NAME变量作为指向void的指针.
我已经尝试传递NAME,&NAME和NAME [0],一个字符名称[4],它被剥离了\ 0以完全符合名称,并且它们都返回显示相同的空指针.有谁知道如何从C++中将函数名称转换为Fortran中的EXTERNAL变量?
谢谢