C# 从本机dll调用方法第一次起作用,Instance第二次崩溃(由于fortran模块)?
我正在创建一个C#net4.5控制台项目,它使用fortran dll。此dll中的方法在第一次调用时运行良好,在第二次调用时Instacrash,没有任何类型的错误消息 运行一些测试时,我发现如果我不使用module1,这意味着将变量声明放在子例程上,它在任何数量的调用上都可以正常工作 C# FORTRANC# 从本机dll调用方法第一次起作用,Instance第二次崩溃(由于fortran模块)?,c#,fortran,pinvoke,C#,Fortran,Pinvoke,我正在创建一个C#net4.5控制台项目,它使用fortran dll。此dll中的方法在第一次调用时运行良好,在第二次调用时Instacrash,没有任何类型的错误消息 运行一些测试时,我发现如果我不使用module1,这意味着将变量声明放在子例程上,它在任何数量的调用上都可以正常工作 C# FORTRAN !DEC$ ATTRIBUTES DLLEXPORT::ingammaextern subroutine sub(size, myarray) use module1 ! *
!DEC$ ATTRIBUTES DLLEXPORT::ingammaextern
subroutine sub(size, myarray)
use module1 ! * REMOVING MODULE USAGE FIXES THE PROBLEM
implicit none
INTEGER :: size
integer :: assignme
REAL, dimension(1:size) :: myarray
assignme = size
allocate(alocarray(1:assignme))
end subroutine
! ************************************begin another file***********
MODULE module1
IMPLICIT NONE
real, dimension(:), allocatable :: alocarray
END MODULE module1
这个解决方案,模块的移除,是非常麻烦的,也是维护上的一大难题,因为我发布的代码问题非常大
环境:GNU Fortran编译器,windows 7 64位,Fortran代码块,VS2012,我没有更改任何编译器选项
有什么想法吗
感谢您抽出时间您应该在离开子例程之前在子例程中释放数组
allocarray
。由于它是例程中主机关联使用的模块变量,因此在离开子例程后,它将保持分配状态。第二次进入例程时再次尝试分配可能是导致崩溃的原因。或者,您可以通过allocated()
内在函数检查其分配状态
!DEC$ ATTRIBUTES DLLEXPORT::ingammaextern
subroutine sub(size, myarray)
use module1 ! * REMOVING MODULE USAGE FIXES THE PROBLEM
implicit none
INTEGER :: size
integer :: assignme
REAL, dimension(1:size) :: myarray
assignme = size
allocate(alocarray(1:assignme))
end subroutine
! ************************************begin another file***********
MODULE module1
IMPLICIT NONE
real, dimension(:), allocatable :: alocarray
END MODULE module1