![](/img/trans.png)
[英]Why is this attempt to pass a pointer from C++ to Fortran not working?
[英]How to pass C++ pointer to Fortran?
我有以下C ++代码:
extern "C" void C_ASSIGN_ARRAY_TO_FORTRAN(double *doublearray)
{
doublearray=new double [10];
for (int i=0;i<10;i++)
doublearray[i]=i;
}
数组doublearray
应该传递给Fortran:
USE, INTRINSIC :: ISO_C_BINDING
IMPLICIT NONE
INTERFACE
SUBROUTINE C_ASSIGN_ARRAY_TO_FORTRAN(cdoublearray) BIND(C, NAME='C_ASSIGN_ARRAY_TO_FORTRAN')
USE, INTRINSIC :: ISO_C_BINDING
IMPLICIT NONE
TYPE(C_PTR) :: cdoublearray
END SUBROUTINE
END INTERFACE
TYPE(C_PTR) :: cdoublearray
REAL(C_DOUBLE), POINTER :: fdoublearray(:)
CALL C_ASSIGN_ARRAY_TO_FORTRAN((cdoublearray))
CALL C_F_POINTER( cdoublearray, fdoublearray,[10])
WRITE (*, *) fdoublearray
END
但是,代码在C_F_POINTER
崩溃:调用C_ASSIGN_ARRAY_TO_FORTRAN
, cdoublearray
等于0
。 有人可以帮我看看吗?
您正在此处传递指针的副本
CALL C_ASSIGN_ARRAY_TO_FORTRAN((cdoublearray))
该副本由第二组括号组成。 因此, cdoublearray
永远不会更改,并保留原始的未定义值(恰好是e 0)。
尝试
CALL C_ASSIGN_ARRAY_TO_FORTRAN(cdoublearray)
但是要小心,在取消分配数组时您仍然会遇到问题。 必须从C ++完成。
您还必须调整过程以接受指向指针的指针。 参见@AlexenderVogt的答案。
您是通过值而不是通过引用传递指针。 您的C ++代码应阅读
extern "C" void C_ASSIGN_ARRAY_TO_FORTRAN(double *& doublearray)
{
doublearray=new double [10];
for (int i=0;i<10;i++)
doublearray[i]=i;
}
注意C_ASSIGN_ARRAY_TO_FORTRAN(double *& doublearray)
。
使用C指针的另一种方式(感谢弗拉基米尔)看起来像:
extern "C" void C_ASSIGN_ARRAY_TO_FORTRAN(double ** doublearray)
{
double *arr = new double [10];
for (int i=0;i<10;i++)
arr[i]= i;
*doublearray = arr;
}
使用弗拉基米尔建议的修复程序,Fortran代码读取
program test
USE, INTRINSIC :: ISO_C_BINDING
IMPLICIT NONE
INTERFACE
SUBROUTINE C_ASSIGN_ARRAY_TO_FORTRAN(cdoublearray) BIND(C, NAME='C_ASSIGN_ARRAY_TO_FORTRAN')
USE, INTRINSIC :: ISO_C_BINDING
IMPLICIT NONE
TYPE(C_PTR) :: cdoublearray
END SUBROUTINE
END INTERFACE
TYPE(C_PTR) :: cdoublearray
REAL(C_DOUBLE), POINTER :: fdoublearray(:)
CALL C_ASSIGN_ARRAY_TO_FORTRAN( cdoublearray )
CALL C_F_POINTER( cdoublearray, fdoublearray,[10])
WRITE (*, *) 'fdoublearray',fdoublearray
END program
然后,输出是
./a.out
fdoublearray 0.0000000000000000 1.0000000000000000 2.0000000000000000 3.0000000000000000 4.0000000000000000 5.0000000000000000 6.0000000000000000 7.0000000000000000 8.0000000000000000 9.0000000000000000
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.