在C中修改Fortran数组

时间:2017-06-15 09:05:57

标签: c arrays fortran fortran-iso-c-binding

在Fortran中,我有一个指定为:

的数组
dimension insv(*)

现在我想从C编辑这个数组。 我设法通过使用iso_c_binding:

从C读取数组
  SUBROUTINE userroutine(insv)
  IMPLICIT NONE
  INTERFACE
  SUBROUTINE MODIFYARRAY(insv) BIND(C)
  USE, INTRINSIC::ISO_C_BINDING
     REAL(C_DOUBLE),DIMENSION(*), INTENT(INOUT) :: insv
  END SUBROUTINE MODIFYARRAY
  END INTERFACE

  dimension insv(*)

  WRITE(insv(0))
  call modifyarray(insv)
  WRITE(insv(0))
  END

我的C函数:

__declspec(dllexport) void modifyarray(double * insv)

但是在C中修改此数组中的值要么崩溃,要么根本不会改变。

__declspec(dllexport) void modifyarray(double * insv)
{
    insv[0] = 1234.00;
}

我不确定我应该更改为iso_c_binding或C函数以使其工作。

更多上下文:fortran数组类型无法更改,因为维度变量是用户例程的参数,而不是我的控件,所以说。 进入fortran函数时,数组已经填充,但需要在C中进行修改。

1 个答案:

答案 0 :(得分:3)

假设:

  • insvreal(C_DOUBLE)
  • 的数组
  • 你想写insv(而不是现在看来insv定义的文件单位)
  • 调用程序将insv定义为10个组件的数组

可能的工作测试案例如下:

的Fortran:

SUBROUTINE userroutine(insv)
    USE, INTRINSIC::ISO_C_BINDING
    IMPLICIT NONE
    INTERFACE
        SUBROUTINE MODIFYARRAY(insv) BIND(C)
            USE, INTRINSIC::ISO_C_BINDING
            REAL(C_DOUBLE),DIMENSION(*), INTENT(INOUT) :: insv
        END SUBROUTINE MODIFYARRAY
    END INTERFACE

    real(C_DOUBLE), dimension(*) :: insv

    WRITE(*,*) insv(1)
    call modifyarray(insv)
    WRITE(*,*) insv(1)
END

PROGRAM MAIN
    USE, INTRINSIC::ISO_C_BINDING
    real(C_DOUBLE) :: insv(10)
    insv = 2.d0
    call userroutine(insv)
END

C:

void modifyarray(double * insv)
{   
    insv[0] = 1234.00;
}