1

我已经尝试了几个小时。我有 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 是可分配的。其余的应该没问题。任何人都知道如何处理这些参数类型?谢谢。

4

1 回答 1

1

调用约定应该是 StdCall 或 ThisCall。Cdecl 表示调用者负责参数的入栈和出栈。StdCall 表示调用者负责入栈,而被调用者负责出栈。ThisCall 通过将第一个参数放入 ECX 并压入堆栈的其余部分来节省时间。Cdecl 仅由 C/C++ 和任何使用可变参数概念的编程语言使用。世界其他地方使用 StdCall。不知道什么使用ThisCall。

您可能需要在整个调用周围放置一个不安全的 {}。

jd 和 vq 由 Fortran 内部分配,因此您无需担心它们。大概它们在退出之前被释放。Fortran 有自己的堆。

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

于 2013-04-13T17:17:30.383 回答