在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中进行修改。
答案 0 :(得分:3)
假设:
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;
}