代码之家  ›  专栏  ›  技术社区  ›  AndyPerfect

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

  •  2
  • AndyPerfect  · 技术社区  · 14 年前

    我目前正在努力将用Fortran编写的DLL导入到VisualBasic中。我已经把所有的基础知识都放下了,所以现在我想再进一步。标题基本上说的都是,但我会解释我到底想做什么。

    对于踢腿和咯咯笑,让我们假设我要传递一个包含三个双值的对象,可能表示三维空间中的一个点。在我的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.perfect的值。现在问题来了。当我传递一个objectpoint实例时,程序打印出一个类似于1.523e-306的值。基本上,告诉我它认为x值所在的位置不是x值。所以,这就是我的问题。甚至可以将对象传递到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 回复  |  直到 14 年前
        1
  •  1
  •   MarkJ    14 年前

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

    不管怎么说,都是这样!我认为vb.net对象将被封送为指针。有 some support 对于Fortran 90中的指针。如果你加上 pointer 到Fortran声明 ThreeDubs .

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

    我怀疑您是否能够调用 三重UBS 对象来自Fortran,所以我不确定传递对象的好处。

    这里是 two articles 在pinvoke上:pinvoke是一个.NET名称,用于调用像Fortran一样的oldschool“非托管”DLL。这些文章解释了.NET参数如何“编组”(转换)到Fortran DLL中。您可以使用属性对编组进行一些控制:这些文章解释得更多。他们倾向于使用C和C作为示例:(

        2
  •  1
  •   M. S. B.    14 年前

    我不了解Visual Basic,但我在Fortran&C之间共享了用户定义的类型。Fortran 2003的ISO C绑定支持此功能,Fortran 95编译器已经广泛支持此功能。您声明一个Fortran用户定义的类型,并给它一个bind c属性和一个bind名称。只要该类型的所有子组件都与C互操作,那么用户定义的类型也与C互操作,并且该方法是标准的和可移植的。我通过将信息传递给fortran用户定义的类型变量作为模块变量,并将C结构变量通过在文件顶部声明在全局内存中来实现这一点。也许您可以在Fortran端使用iso c绑定,并以某种方式告诉VisualBasic使用C类接口?