我有一些用VBA编写的代码,它使用我编程的特定环境的功能,该函数给定一些空的,不是固定维度的Single
数组,并将它们返回2维并填充数据。它还生成一个Variant
作为输出。
VBA 代码是:
Dim vDummy As Variant
Dim RealLev1() As Single, ImagLev1() As Single
vDummy = FFPOL1Array(RealLev1, ImagLev1)
现在,我确信FFPOL1Array
是用 FORTRAN 编写的例程,但我无法以任何方式访问其代码。
我成功地设法在一段 VB.NET 代码中解决了相同的例程,方法是编写一种解决方法,将我的代码"链接"到上述环境并使用其自己的脚本例程。
我 VB.NET 代码是:
Dim vDummy As Object
Dim RealLev1(,) As Single, ImagLev1(,) As Single
vDummy = NSI.FFPOL1Array(RealLev1, ImagLev1)
NSI
是"脚本例程对象",它与许多其他函数和子例程一起工作。
遗憾的是,上面的代码不起作用,因为(根据调试器)类型冲突。所以我检查了类资源管理器,发现FFPol1Array
类定义为:
get_FFPOL1Array(ByRef System.Array, ByRef System.Array) As Object
set_FFPOL1Array(ByRef System.Array, ByRef System.Array, ByRef Object)
因此,我试图将我的数组Dim
为System.Array
Single
的instad,但由于类型冲突,这总是失败。我做错了什么?
好吧,这有点荒谬,但我设法理解我最终必须初始化Array
s,因为FORTRAN函数没有这样做:
Dim RealLev1 As Array = Array.CreateInstance(GetType(Single), 1, 1)
Dim ImagLev1 As Array = Array.CreateInstance(GetType(Single), 1, 1)
这完成了工作。更好的是:
Dim RealLev1(,) As Single = Array.CreateInstance(GetType(Single), 1, 1)
Dim ImagLev1(,) As Single = Array.CreateInstance(GetType(Single), 1, 1)
正如@Nathan_Sav所建议的,get_FFPOL1Array 返回一个对象,因此您需要使用 Set。
Set vDummy = NSI.FFPOL1Array(RealLev1, ImagLev1)