从本机dll调用方法第一次工作,第二次instacrash(由于fortran模块)

本文关键字:instacrash 由于 fortran 模块 第二次 dll 本机 调用 方法 工作 第一次 | 更新日期: 2023-09-27 18:03:48

我正在创建一个c# net4.5控制台项目,它使用fortran dll。此dll中的方法在第一次调用时工作良好,第二次调用时instacrashs,没有任何类型的错误消息。

运行一些测试,我发现如果我不使用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位,CodeBlocks for Fortran, VS2012,我没有改变任何编译器选项

任何想法?

感谢您的宝贵时间

从本机dll调用方法第一次工作,第二次instacrash(由于fortran模块)

您应该在离开子例程之前释放数组allocarray。由于它是宿主关联在例程中使用的模块变量,因此在子例程离开后,它将保持分配状态。当您第二次进入例程时试图再次分配它可能是导致崩溃的原因。或者,您可以通过allocated()固有函数检查其分配状态。