可以将对象作为参数传递给Fortran方法吗?

时间:2010-08-25 21:09:54

标签: vb.net dll fortran

我目前正致力于将用Fortran编写的DLL导入Visual Basic。我已经掌握了所有的基础知识,所以现在我试图更进一步。标题基本上都说明了一切,但我会解释它到底是做什么的。

对于踢和傻笑,让我们假设我想传递一个有三个双值的对象,可能代表三维空间中的一个点。在我的Fortran方法中,我想获取该对象,打印出x值,然后将x值更改为7.5。这是我的Fortran代码,就是这样。

module test
   type Point
      double precision x, y, z
   end type Point
end module test

function ex1(ThreeDubs)
   use test
   type (Point) :: ThreeDubs
   print *, ThreeDubs%x
   ex1 = 1
   return
end function

这段代码效果很好!......仅适用于结构。换句话说,假设我在VB中有以下结构和类

Public Structure StructurePoint
   Public x As Double
   Public y As Double
   Public z As Double
End Structure

Public Class ObjectPoint
    Public x As Double
    Public y As Double
    Public z As Double
End Class

创建StructurePoint的实例可以产生完美的结果:Fortran方法打印出x值,然后修改x的值。完善。现在问题。当我传递ObjectPoint的一个实例时,程序打印出一个类似于1.523E-306的值。基本上,告诉我它认为x值所在的位置不是x值。所以,这就是我的问题。甚至可以将一个Object传递给Fortran DLL并正确访问它,如果是这样,我将如何进行呢?

解决方案

为了将此对象传递给Fortran,修改类声明是唯一必须完成的事情。

<StructLayout(LayoutKind.Sequential)> _
Public Class CustomPoint3d
    Public x As Double
    Public y As Double
    Public z As Double
End Class

<DllImport("passPoint3d.dll")> _
Public Shared Function PrintX(ByVal point As CustomPoint3d) As Boolean
End Function

2 个答案:

答案 0 :(得分:1)

我不了解Visual Basic,但我在Fortran&amp;之间共享了用户定义的类型。 C.这得到了Fortran 2003的ISO C Binding的支持,Fortran 95编译器已经广泛支持它。您声明Fortran用户定义的类型,并为其提供绑定C属性和绑定名称。只要该类型的所有子组件都可与C互操作,则用户定义的类型也可与C互操作。并且该方法是标准的和便携的。我通过将Fortran用户定义的类型变量作为模块变量传递信息来完成此操作,并且C结构变量通过在文件顶部声明而在全局内存中。也许你可以在Fortran端使用ISO C Binding,并以某种方式告诉Visual Basic使用类似C的界面?

答案 1 :(得分:1)

这可能很难,我认为没有任何好处,所以我建议你不要打扰!

无论如何都要去!我认为VB.Net对象将被编组为指针。 Fortran 90中有some support指针。如果您将pointer添加到ThreeDubs的Fortran声明中,它可能会有效。

function ex1(ThreeDubs) 
   use test 
   type (Point), pointer :: ThreeDubs ! Note additional pointer keyword
   print *, ThreeDubs%x 
   ex1 = 1 
   return 
end function 

我怀疑你是否能够从Fortran调用ThreeDubs对象中的方法,所以我不确定传递对象的好处。

以下是PInvoke上的two articles:PInvoke是用于调用oldschool“非托管”DLL(如Fortran)的.Net名称。这些文章解释了如何将.Net参数“编组”(翻译)到Fortran DLL中。您可以使用属性控制编组:文章解释更多。他们倾向于使用C和C#作为例子:(