我可以将C#
结构传递给FORTRAN
就好了。我甚至可以将C#
结构的数组作为TYPE()
的数组传递给FORTRAN
。我遇到麻烦的地方是当我试图将值返回到C#
时。下面是一个例子:从C#调用FORTRAN DLL并将值分配给结构数组
的FORTRAN DLL是:一个期望结果
MODULE TESTING
TYPE VALUEREF
INTEGER*4 :: A
ENDTYPE VALUEREF
CONTAINS
SUBROUTINE TEST_REF(T,N)
!DEC$ ATTRIBUTES DLLEXPORT :: TEST_REF
!DEC$ ATTRIBUTES ALIAS:'TEST_REF' :: TEST_REF
!DEC$ ATTRIBUTES VALUE :: N
IMPLICIT NONE
INTEGER*4 :: A,I,N
TYPE(VALUEREF) :: T(N)
A = 100
DO I=1,N
T(I)%A = A + I
END DO
END SUBROUTINE
END MODULE
和C#
调用函数是:
[StructLayout(LayoutKind.Sequential)]
public struct ValueRef
{
public int a;
}
[DllImport("mathlib.dll")]
static extern void TEST_REF(ValueRef[] t, int n);
void Main()
{
ValueRef[] T = new ValueRef[4];
for (int i = 0; i < T.Length; i++)
{
T[i].a = i;
}
Console.WriteLine("Initialize");
for (int i = 0; i < T.Length; i++)
{
Console.WriteLine(" A={0}", T[i].a);
}
Console.WriteLine("Call Fortran");
TEST_REF(T, T.Length);
for (int i = 0; i < T.Length; i++)
{
Console.WriteLine(" A={0}", T[i].a);
}
}
带结果:
Initialize
A=0
A=1
A=2
A=3
Call Fortran
A=0
A=1
A=2
A=3
调试通过FORTRAN代码,我看到初始值从C#
传递到FORTRAN
就好。这些值将被新值覆盖,并且控制权将传回到C#
,其中旧值仍包含在ValueRef
实例中。
为什么我可以通过并以类似的方式返回一组float
或int
,这很好。我可以通过并返回单数结构与ref
关键字,我可以通过,但不返回和struct
数组?
PS。我正在使用Compaq Visual Fortran 6.5 & .NET 3.5
PS2。我很欣赏这方面的任何意见/想法。我完成了95%的项目,现在我遇到了这个问题。这个项目的重点是尽可能地使用结构来减少传递给函数的#参数,并保留OOP设计的某些方面。
我想这取决于运行时如何编组你的值,这应该不是问题,它总是工作正常,我很惊讶地看到一个FORTRAN/C#混合。 – 2011-06-03 19:45:58
注意反标格式不可用于标题,不幸的是 – AakashM 2011-06-03 21:12:59
现实中的现代FORTRAN很容易和快速。我没有理由不仅为了保留遗留代码,而且在FORTRAN中开发新代码。当然对于GUI而言,我将它留给C#/ OpenTK。 – ja72 2011-06-04 03:30:07