2012-12-17 51 views
1

我想教自己從VB調用fortran子程序。我正在嘗試使用非常簡單的示例,但不知何故,它不起作用。我正在使用Visual Studio 2010和Intel Visual Fortran。這裏是我正在嘗試的代碼:在VB中使用Fortran DLL

SUBROUTINE ARRAYTEST(arr) 
!DEC$ ATTRIBUTES DLLEXPORT, ALIAS:"ARRAYTEST" :: ARRAYTEST 
REAL arr(3, 7) 
INTEGER i, j 
DO i = 1, 3 
    DO j = 1, 7 
     arr (i, j) = 11.0 * i + j 
    END DO 
END DO 
END SUBROUTINE 

而且它成功創建DLL文件。這裏是我的Visual Basic代碼:

Public Class Form1 
Private Declare Sub ARRAYTEST Lib "FortTest.DLL" Alias "ARRAYTEST" (ByVal x As Single) 
Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click 
    Dim arr(0 To 2, 0 To 6) As Single 
    Call ARRAYTEST(arr(0, 0)) 
    TextBox1.Text = arr(3, 3) 
End Sub 

End Class 

當我把DLL文件的目錄,並運行代碼,我得到了以下錯誤: 型「System.AccessViolationException」的第一次機會異常出現在ForRun.exe

我使用Google搜索,但沒有找到解決方案,如果有人能告訴我我做錯了什麼,以及如何解決這個問題,我會非常感激。提前謝謝你。

+0

從未使用過fortran,但顯然sub需要一個指向'real'的指針,並且傳遞一個實際的'real',將其解釋爲指針。嘗試將[x()As Single'和marshalling聲明爲[LPArray](http://msdn.microsoft.com/zh-cn/library/system.runtime.interopservices.unmanagedtype.aspx):'Private Declare Sub ARRAYTEST Lib「 FortTest.DLL「Alias」ARRAYTEST「( ByVal x()As Single)'。 – GSerg

回答

1

您可以嘗試使用DllImport表示法,這是我在這種特殊場景(VB.NET中的FORTRAN)中最成功的表示法。

Imports System.Runtime.InteropServices 

Public Class Form1 

    Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click 
     Dim arr(0 To 2, 0 To 6) As Single 
     ARRAYTEST(arr(0, 0)) 
     TextBox1.Text = arr(3, 3) 
    End Sub 

End Class 

Public Module FortranInterop 
    <DllImport("FortTest.DLL", CallingConvention:=CallingConvention.StdCall, EntryPoint:="ARRAYTEST")> _ 
    Public Sub ArrayTest(ByRef x as Single) 
    End Sub  
End Module 
  1. 我會提到的第一件事是,通過陣列時,傳遞變量ByReference是必要的。我很確定我們通過引用傳遞了所有的變量,但如果FORTRAN沒有修改它,我不確定它是否有必要。這可能是您的AccessViolation錯誤的來源。其次,我把StdCall CallingConvention,但我不是100%確定IVF默認調用約定是什麼。我們總是在我們的屬性標題中明確地將其設置爲CDECL

  2. 最後,我會謹慎傳遞2D(+)數組到FORTRAN。我認爲我沒有真正測試或看過它,但是我在IVF開發人員論壇上讀到了FORTRAN轉換從.NET傳遞的數組(行成爲列)的情況。另一件需要注意的事情。

1

我知道這是一個老問題,但有一個簡單的答案,似乎沒有人注意到。你已經聲明瞭arr(0到2,0到6),但是你調用的arr(3,3)超出了聲明的範圍(3不包含在0到2中)。 System.AccessViolationException是一個常見的錯誤,通常表示您在數組邊界之外引用,即您正在嘗試訪問內存中尚未爲此變量保留的內容,因此訪問衝突。

如果你使用TextBox1.Text = arr(2,3),你不應該得到那個錯誤,整個事情應該可以正常工作。

希望這可以幫助任何人看現在的問題。