如何通过C++;指向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; }
但是,代码在如何通过C++;指向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; },c++,pointers,fortran,fortran-iso-c-binding,C++,Pointers,Fortran,Fortran Iso C Binding,但是,代码在C\u F\u指针处崩溃:调用C\u ASSIGN\u ARRAY\u TO\u FORTRAN后,cdoublerary等于0。 有人能帮我看一下吗?您是通过值传递指针,而不是通过引用传递指针。您的C++代码应该读取 extern "C" void C_ASSIGN_ARRAY_TO_FORTRAN(double *& doublearray) { doublearray=new double [10]; for (int i=0;i<10;i++)
C\u F\u指针处崩溃:调用C\u ASSIGN\u ARRAY\u TO\u FORTRAN
后,cdoublerary
等于0
。
有人能帮我看一下吗?您是通过值传递指针,而不是通过引用传递指针。您的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;
}
使用Vladimir建议的修复,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
您正在此处传递指针的副本
CALL C_ASSIGN_ARRAY_TO_FORTRAN((cdoublearray))
副本由第二组括号生成。因此,cdoublearray
永远不会更改,并保留发生在e 0上的原始未定义值
试一试
但是要小心,在释放阵列时仍然会有问题。这必须由C++来完成。
您还必须调整过程以接受指向指针的指针。请参阅@AlexenderVogt的答案。您到底有什么问题?它编译吗?调用C\u ASSIGN\u ARRAY\u TO_FORTRAN
后,cdoublearray
等于0,所以当运行到C\u\u指针
时,程序崩溃了。为什么将cdoublearray
作为副本传递((cdoublearray))
什么被破解了?它是否打印了什么?你是说“崩溃”吗?<代码>和<代码>是C++引用,它不支持在<代码>外“c”<代码>函数中,而不是FORTRAN的<代码>绑定(C)< /> >,虽然它通常被实现为指针。应该使用C指针*
。感谢您的友好回复。我按照你的建议修改了,但结果是一样的。只需在那里放置第二颗星星,而不是符号。现在你有一个C++引用的指针。哦,我的上帝!只有(cdoublearray)
会导致错误!在我将行CALL C_ASSIGN_ARRAY_TO_FORTRAN((cdoublearray))
更改为CALL C_ASSIGN_ARRAY_TO_FORTRAN(cdoublearray)
之后,一切都正常了!我的意思是,在使用了引用之后&。如何解释这种差异?Thanks@Alexander&VladimirF非常感谢您的建议。我已经通过C++改变了代码来释放内存。
./a.out
fdoublearray 0.0000000000000000 1.0000000000000000 2.0000000000000000 3.0000000000000000 4.0000000000000000 5.0000000000000000 6.0000000000000000 7.0000000000000000 8.0000000000000000 9.0000000000000000
CALL C_ASSIGN_ARRAY_TO_FORTRAN((cdoublearray))
CALL C_ASSIGN_ARRAY_TO_FORTRAN(cdoublearray)