gpt4 book ai didi

c - 在 C 中修改 Fortran 数组

转载 作者:太空宇宙 更新时间:2023-11-04 01:50:19 25 4
gpt4 key购买 nike

在 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 个组件的数组

一个可能的工作测试用例如下:

语言:

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

关于c - 在 C 中修改 Fortran 数组,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44563343/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com