如何使用c sharp的可分配类型输出调用fortran子例程

时间:2013-04-11 09:01:16

标签: c# fortran90

我已经尝试过几个小时。我有Fortran代码,并希望在我的c sharp项目中使用它。

  subroutine lean(nx,nlam,flmin,
  ulam,thr,isd,intr,maxit,lmu,a0,ca,ia,nin,rsq,alm,nlp,jerr)
  real x(no,ni),y(no),w(no),vp(ni),ca(nx,nlam),cl(2,ni)                 
  real ulam(nlam),a0(nlam),rsq(nlam),alm(nlam)                          
  integer jd(*),ia(nx),nin(nlam)                                        
  real, dimension (:), allocatable :: vq;  
  ...

我在c sharp中使用了以下代码来导入这个子程序。

    [DllImport("lean.dll", CallingConvention = CallingConvention.Cdecl)]
    private static extern void lean_(
        ref int nx, 
        ref int nlam,
        ref float flmin,
        ref float[] ulam,
        ref float thr, 
        ref int isd,
        ref int intr, 
        ref int maxit, 
        ref int lmu,
        [In,Out]  ref float[] a0,
        [In,Out]  ref float[,] ca,
        [In,Out]  ref int[] ia,
        [In,Out]  ref int[] nin,
        [In,Out]  ref float[] rsq,
        [In,Out]  ref float[] alm, 
        ref int nlp, 
        ref int jerr);

我收到了这个错误

尝试读取或写入受保护的内存。这通常表明其他内存已损坏。

在这个函数中,有两个参数我不知道如何处理,jd的类型为jd(*) 和vp是可分配的。其余的应该没问题。任何人都知道如何处理这些参数类型?感谢。

1 个答案:

答案 0 :(得分:1)

调用约定应该是StdCall或ThisCall。 Cdecl表示调用者负责堆叠和取消堆栈参数。 StdCall意味着调用者负责堆叠,但被调用者负责取消堆栈。通过将第一个参数放入ECX并推送堆栈的其余部分,ThisCall可以节省时间。 Cdecl仅由C / C ++和任何使用varargs概念的编程语言使用。世界其他地方使用StdCall。不确定是什么使用ThisCall。

你可能需要在整个电话中放置一个不安全的{}。

jd和vq由Fortran内部分配,因此您无需担心它们。据推测,他们在退出前被解除分配。 Fortran有自己的堆。

如果是多线程的,则需要将数组声明为固定的。当Fortran处理它们时,它们无法移动。