我已经尝试过几个小时。我有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是可分配的。其余的应该没问题。任何人都知道如何处理这些参数类型?感谢。
答案 0 :(得分:1)
调用约定应该是StdCall或ThisCall。 Cdecl表示调用者负责堆叠和取消堆栈参数。 StdCall意味着调用者负责堆叠,但被调用者负责取消堆栈。通过将第一个参数放入ECX并推送堆栈的其余部分,ThisCall可以节省时间。 Cdecl仅由C / C ++和任何使用varargs概念的编程语言使用。世界其他地方使用StdCall。不确定是什么使用ThisCall。
你可能需要在整个电话中放置一个不安全的{}。
jd和vq由Fortran内部分配,因此您无需担心它们。据推测,他们在退出前被解除分配。 Fortran有自己的堆。
如果是多线程的,则需要将数组声明为固定的。当Fortran处理它们时,它们无法移动。