如何通过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)