【发布时间】:2012-12-17 15:17:05
【问题描述】:
我正在尝试自学从 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文件放到目录下,运行代码时,出现如下错误: ForRun.exe 中发生了“System.AccessViolationException”类型的第一次机会异常
我用谷歌搜索但没有找到解决方案,如果有人能告诉我我做错了什么以及如何解决它,我将不胜感激。非常感谢您。
【问题讨论】:
-
从未使用过fortran,但显然sub 需要一个指向
real的指针,而您传递了一个实际的real,它被解释为指针。尝试声明x() As Single并编组为 LPArray:Private Declare Sub ARRAYTEST Lib "FortTest.DLL" Alias "ARRAYTEST" (<MarshalAs(UnmanagedType.LPArray), [In](), Out()> ByVal x() As Single)。