1

VBからfortranサブルーチンを呼び出すことを独学しようとしています。そして、私は本当に単純な例で作業しようとしていますが、どういうわけかうまくいきません。Intel Visual Fortran で Visual Studio 2010 を使用しています。これが私が試しているコードです:

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 ファイルをディレクトリに配置してコードを実行すると、次のエラーが発生しました。

私はグーグルで検索しましたが、これに対する解決策が見つかりませんでした. よろしくお願いします。

4

2 に答える 2

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 エラーの原因である可能性があります。

  2. 次に、StdCall CallingConvention を配置しましたが、IVF の既定の呼び出し規則が何であるかは 100% わかりません。CDECL属性ヘッダーで常に明示的に設定します。

  3. 最後に、2D(+) 配列を FORTRAN に渡すことには慎重です。実際にテストしたり見たりしたことはないと思いますが、IVF 開発者フォーラムで、FORTRAN が .NET から渡された配列を転置する (行が列になる) ことを読みました。知っておくべきもう1つのこと。

于 2012-12-17T15:47:21.917 に答える