我正在创建一个消耗fortran dll的C#net4.5控制台项目。这个dll的方法在第一次调用时工作正常,在第二次调用时instacrashes,没有任何类型的错误消息。
运行一些测试,我发现 如果我不使用module1,意味着将变量声明放在子程序中,它可以在任意数量的调用上正常工作
C#
static void Main(string[] args)
{
TestMyArray();//WORKS FLAWLESLY
TestMyArray();//INSTAKILLS PROGRAM
}
private static void TestMyArray()
{
Console.WriteLine("START");
int size = 52;
float[] myarray = new float[size];
sub_(ref size, myarray);
Console.WriteLine(myarray.Select(x => x.ToString()).Aggregate((x, y) => x + ";" + y));
Console.ReadLine();
}
[DllImport("FortranArraySimpleTest.dll", CallingConvention = CallingConvention.Cdecl)]
static extern void sub_(ref int size, float[] myarray);
FORTRAN
!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的CodeBlocks,VS2012,我没有改变任何编译器选项。
有什么想法吗?
感谢您的时间
答案 0 :(得分:0)
在离开之前,您应该在子例程中释放数组allocarray
。因为它是例程中主机关联使用的模块变量,所以在子例程离开后它将保持分配状态。当您第二次进入例程时尝试再次分配它可能是导致崩溃的原因。或者,您可以通过allocated()
内在函数检查其分配状态。