Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/vb.net/14.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Vb.net 是否可以将对象作为参数传递给Fortran方法?_Vb.net_Dll_Fortran - Fatal编程技术网

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

Vb.net 是否可以将对象作为参数传递给Fortran方法?,vb.net,dll,fortran,Vb.net,Dll,Fortran,我目前正致力于将用Fortran编写的DLL导入Visual Basic。我已经把所有的基本知识都记下来了,所以现在我试着更进一步。这个标题基本上说明了一切,但我会解释我到底想做什么 对于kicks和giggles,让我们假设我想要传递一个对象,其中有三个双值,可能代表三维空间中的一个点。在我的Fortran方法中,我想获取该对象,打印出x值,然后将x值更改为7.5。这是我的Fortran代码,它就是这样做的 module test type Point double prec

我目前正致力于将用Fortran编写的DLL导入Visual Basic。我已经把所有的基本知识都记下来了,所以现在我试着更进一步。这个标题基本上说明了一切,但我会解释我到底想做什么

对于kicks和giggles,让我们假设我想要传递一个对象,其中有三个双值,可能代表三维空间中的一个点。在我的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值。所以,我的问题就在这里。甚至可以将对象传递到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
_
公共类CustomPoint3d
公共x作为双
公营部门应加倍努力
公共z为双
末级
_
公共共享函数PrintX(ByVal point作为CustomPoint3d)作为布尔值
端函数

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

这可能很困难,而且我认为没有任何好处,因此我建议您不要麻烦

不管怎样,还是来了!我认为VB.Net对象将被封送为指针。在Fortran 90中,指针是不可用的。如果将
指针
添加到
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的:PInvoke是一个.Net名称,用于调用老式的“非托管”DLL,如您的Fortran。这些文章解释了如何将.Net参数“封送”(翻译)到Fortran DLL中。您可以使用属性对编组进行一些控制:文章对此进行了详细解释。他们倾向于使用C和C#作为示例:(

我认为Andy已经实现了这一点:Fortran用户定义类型与Vb.Net结构之间的转换,这是Vb中的等效数据类型,类似于C结构。但是Andy希望将Vb.Net对象传递到Fortran.hmm中,使代码中的点类型成为指针,从而产生完全相同的结果。我将花一点时间查看这些链接。)好的,这是另一篇文章中的另一个猜测,将
指针保持在Fortran中,并在VB.Net中添加这一行
_
就在VB.Net
公共类…
定义之前。您还没有发布您的declare语句:它将需要类似于
声明函数ex1 Lib“?.dll”(ByVal x作为ObjectPoint)的内容作为整数
或是
ex1
返回一个双精度??这很好,先生!我将更新我的代码,以反映将对象传递给Fortran的解决方案的最终效果。非常感谢。