2010-08-25 116 views
2

我目前正致力於能夠將用Fortran編寫的DLL導入到Visual Basic中。我已經掌握了所有的基礎知識,所以現在我試着更進一步。標題基本上說了這一切,但我會解釋我正在嘗試做什麼。可能將對象作爲參數傳遞給Fortran方法?

對於踢腿和咯咯,讓我們假設我想傳遞一個有三個雙值的對象,可能代表三維空間中的一個點。在我的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 

回答

1

這可能是困難的,我不認爲有任何好處,所以我建議你不要打擾!

無論如何,這裏就是!我認爲VB.Net對象將被編組爲一個指針。在Fortran 90中有指針的some support。如果您將pointer添加到Fortran的ThreeDubs聲明中,它可能會有效。

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

我懷疑你將永遠是能夠調用從Fortran語言的ThreeDubs對象的方法,所以我不知道傳遞對象的利益。

這是twoarticles on PInvoke:PInvoke是用於調用oldschool「非託管」DLL的.NET名稱,如Fortran。這些文章解釋了.Net參數如何「編組」(翻譯)到Fortran DLL中。您可以使用屬性對編組進行一些控制:文章解釋更多。他們傾向於使用C和C#的例子:(

+0

hmm,使得我的代碼中的Point類型的指針產生完全相同的結果,我將花一點時間看看你放置的這些鏈接。 – AndyPerfect 2010-08-26 19:04:53

+1

確定這裏是另一篇文章的另一個猜測http://msdn.microsoft.com/en-us/library/xedhyxyd(VS.71).aspx在Fortran中保存'pointer',並在VB.Net中添加這行代碼在VB.Net'Public Class ...'定義之前的' _'。你還沒有發佈你的聲明語句:它需要類似'Declare Function ex1 Lib「???。dll」(<[In], Out> ByVal x As ObjectPoint)As Integer'或者是'ex1'返回一個double? – MarkJ 2010-08-26 21:06:47

+0

這是我的好先生!我將更新我的代碼以反映解決方案最終看起來像傳遞一個對象到Fortran的結果。謝謝一堆。 – AndyPerfect 2010-08-27 16:26:02

1

我不知道有關Visual Basic,但我的Fortran & C.這是由ISO C的Fortran 2003年,結合這已經是廣受Fortran 95的支持支持之間共享用戶定義類型編譯器。您聲明一個Fortran用戶定義類型,併爲其指定bind C屬性和一個綁定名稱。只要該類型的所有子組件都可與C互操作,則用戶定義類型也可與C互操作。此方法是標準且便攜的。我通過將Fortran用戶定義類型變量作爲模塊變量傳遞信息,並通過在文件頂部聲明C結構變量位於全局內存中來完成此任務。也許你可以在Fortran方面使用ISO C Binding,並以某種方式告訴Visual Basic使用C類接口?

+0

我認爲安迪已經得到了這個工作:Fortran用戶定義類型來往於Vb.Net結構,這是VB中的等價數據類型,類似於C結構。但是Andy想要將一個VB.Net對象傳遞給Fortran。 – MarkJ 2010-08-26 08:07:21

相關問題