在 C 中修改 Fortran 数组

Modifying a Fortran array in C

在 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中需要修改

假设:

  • 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;
}