自 C# 中调用 NAG C 算法库 (DLL)
NAG Fortran 算法库包含超过 1,700 多个函数。基本上这些函数可以直接在 .NET 环境中使用 Microsoft 提供的 P/Invoke 方法调用。本文的目的将说明在 C# 语言中调用 NAG Fortran 算法库的机制,并提供相关的示例进行说明。
Fortran 算法库中采用了以下的资料型别作为参数传递。如:
纯量:DOUBLE PRECISON, INTEGER 与 COMPLEX*16 型别
数组:DOUBLE PRECISION, INTEGER 与 COMPLEX*16 型别
字符串与字符数组
函数参数,也就是回呼 callbacks 函数
这里主要的任务就是如何将这些型别对应到 C# 中
在 C# 中,我们能够选择参数是以值或以参考传递。在 Fortran 语言中,所有的参数都仅能以参考传递。 因此每一个 Fortran 中的纯量参数都必须指定为 ref。 这并不适用于数组,因为在 C# 中数组是以参考传递。以下的示例能够说明这点。
另一个我们必须要特别留意的是数组。在 Fortran 语言中,二维的数组是以列的方式连续存放, 而 C# 所定义的 [,] 二维数组则是以行方式连续存放。 也因此,若要在 C# 中传递二维数组给 Fortran 函数,就必须要先经过数组转换。请参考 f07abfe.cs
我们注意到在 C# 中并没有 complex 型别。一个复数 Z,可以被表示为成对的 Z 的实数与虚数。 在 Fortran 中,这是 complex 型别储存的方式,所以我们也可在 C# 中利用这个方式。具体上来说,我们可以使用 C# 的 double 数组来放复数的实部与虚部,并将其传递至 NAG DLL 中来表示复数数组或复数值。 或许我们可以定义一个包含有两个 double 型态的结构来表示复数型别,但我们发现此仅能作为输入参数用。 我们可以透过这个方式传递复数资料给 Fortran DLL,但是无法由 DLL 中取得这个结构的回传资料。参考 f07apfe.cs
字符串型别可在 C# 中声明为 string 型别。在 C# 中,字符串必须要固定的长度,所以需要另一个参数纪录字符串长度。 在 Foretran 语言中的字符数组是连续的储存空间,所以不能以字符串数组取代。 我们可以透过利用 byte 数组仿真 Fortran 字符数组。请参考 g02eafe.cs
在 Fortran 中的函数参数,对应到 C# 中的委托 (delegate) 型别。在委托型别中的数组数需要使用 C# 的 IntPtr 型别与 Marshall 类别。 可参考 e04ucae.cs
我们提供基于 NAG Fortran 使用手册中示例程序的 C# 程序,用来说明各种不同参数型别如何对应 C#。 例如:调用 e04uca 的 C# 类别可参考 e04ucae.cs。如果您需要的函数定义并不在我们所提供的例子中,您可以与 与我们联络,我们将乐于提供协助。
- Example 1
-
参数:double 纯量,简单的回呼 (callback) 函数
d01ajfe.cs - Example 2
-
参数:double 数组,多回调函数
e04ccfe.cs - Example 3
-
参数:double 数组,二维数组回呼 (callback)
e04ucae.cs - Example 4
-
参数:2-D double 数组
f04ajfe.cs - Example 5
-
参数:2-D double 数组,字符串
f07abfe.cs - Example 6
-
参数:2-D complex 数组,字符串
f07apfe.cs - Example 7
-
参数:2-D double 数组
g02dafe.cs - Example 8
-
参数:字符串数组
g02eafe.cs - Example 9
-
参数:double 纯量
s07aafe.cs
除了以上的示例外,我们也提供以下的例子: