繁体   English   中英

如何将C ++指针传递给Fortran?

[英]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_FORTRANcdoublearray等于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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM