NAG DLL 与 .NET
在 VB6 与其下一个版的 VB .NET 间存在着许多基本上的差异,他们某种程度会影响 NAG Fortran 函数的调用方式。本文中,我们将介绍如何利用在 VB6 与 VB .NET 中使用 NAG 算法库的函数。
在 Microsoft 的网站上提到有关 .NET:"所以这个下一代的发布的计算是基于现在这一代上。Microsoft .NET 并不是全部用来全部取代我们已知的应用程序, 而是一种自然的演变,将带来合作与互操作性的好处。"
NAG 的使用者很自然的问到,这个演进的过程会不会改变他们的程序。此篇短文中指出 VB6 与 VB 的下一个版本 VB .NET 基本上的差异,以及如何影响 NAG Fortran 函数的接口。
所有的 .NET 语言都是建立在相同的架构上。从 VB 的角度来看,会有类似 C 的差异,数组将以列方式储存而非以行的方式储存。例如数组 A(1,2) 连续性的储存空间:
在 VB6 中会以 A(0,0), A(1,0), A(0,1), A(1,1), A(0,2), A(1,2) 的连续空间储存。
而在 VB .NET 中,相同的定义方式将会是以下面的方式储存:
A(0,0), A(0,1), A(0,2), A(1,0), A(1,1), A(1,2)。
VB6 的协议与 Fortran 语言是一致的。能够很容易的将 VB6 数组传递给 NAG Fortran 函数。还有另一个需要注意的地方是关于数组的列与行的个数,Fortran 函数能够正确识别在 VB 数组中每一个元素的地址。
如果我们想要在 VB .NET 中传递数组,则将会误导函数的处理。尤其当处理数组的第二个元素 A(1,0) 时,在实务上将会取得 A(0,1) 的资料。
为了解决这个问题,用户必须要转换数组。将 A 数组转换为 B(2,1),也就是 B(i,j) 要等于 A(j,i)。在 VB .NET 中,储存的位置将会是:
B(0,0), B(0,1), B(1,0), B(1,1), B(2,0), B(2,1)
在 Fortran 函数中会解释为:
A(0,0), A(1,0), A(0,1), A(1,1), A(0,2), A(1,2)
因此,在 VB .NET 中,我们必须特别处理数组的转置,才能在 Fortran DLL 中使用。另外在 Fortran 文件中还需要注意的一点是 "leading dimension" 参数,也就是 A 数组的列个数,是 A 数组的第一个元素值。 就 B 数组来说,就是 B 数组的行数。可由 B 数组的第二个元素得到。
另一个跟 C 类似的特色就是数组的起始元素是 0。在 VB6 中,可以透过 OPTION BASE 1 来设定预设的起始值。我们建议使用者采用这样的方式,来确保 Fortran 与 VB 的数组索引值是一致的。然而,在 VB .NET 中并不支援 OPTION BASE。
如同 C 语言对参数的传递一样,预设是以传值 (ByVal) 方式进行,同样的 VB .NET 也是。这与 VB6 预设以传址 (ByRef) 方式传递有明显的差异。 NAG Fortran 函数通常接受传址的调用方式,所以很重要的是需要在定义语句时指定为 ByRef。
VB6 与 VB .NET 对相关的 Integer 与 Long 资料型别有不同的位数。例如在 VB6 中 Long 变量相当于 Fortran 的 INTEGER 型别,但在 VB .NET 中,Integer 型别等于 32 位的 Fortran INTEGER 型别。
由于这样的改变,我们算法库在发布时会提供两种不同声明语句,一个提供给 VB6 与 VBA,另一个则支援 VB .NET。我们希望 NAG 的使用者都能够同时利用 VB6 与 VB .NET 调用 NAG 函数。