在 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中需要修改
假设:
insv
是 real(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;
}
在 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中需要修改
假设:
insv
是real(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;
}