【问题标题】:translate Expokit into C将 Expokit 翻译成 C
【发布时间】:2015-02-24 11:47:27
【问题描述】:

我想使用用 C 语言用 fortran77 编写的“expokit”包。我确实在我的 linux 系统上安装了 f2c,并将 zhpadm.f 文件翻译成 zhpadm.c。接下来我应该怎么做才能在 C 中对矩阵求幂。我应该在 C 主程序中包含哪些文件?

如何将参数传递给 C 中的函数 zhpadm()?我的问题是二维数组。我不知道如何传递这些,我也不知道如何传递复数。对于真正的一维数组,它可以工作。

我正在使用 gfortran 和 gcc。

【问题讨论】:

  • 想要在 C 中使用这个例程的确切原因是什么?请注意,f2c 生成的 C 代码难以阅读并且通常被认为是不可维护的。它还依赖于一个特殊的库。考虑使用 gfortran 编译包,并使用 Fortran 的 C 互操作的标准工具从 C 调用您想要的例程,使用使接口更容易的包装函数。
  • 我想从 C 中调用 fortran 子例程,但是我遇到了二维数组的问题。我不知道如何通过它们和复数。对于真正的一维数组,它可以工作。我还没有尝试过一维复杂数组。我在 C 中使用 complex.h
  • 调用 Fortran 版本应该比翻译好得多。

标签: c fortran fortran77 fortran-iso-c-binding


【解决方案1】:

为了将数据从 C 传递到多维数组到 Fortran,您必须了解 Fortran 数组的布局。

Fortran 数组由一系列存储位置组成。假设你有一个 Fortran 子程序

   subroutine foo(a,n,m)
   real, intent(inout) :: a(n,m)

这为您提供了一个 N*M 数组。默认情况下,Fortran 数组索引从 1 开始,因此 A(1,1) 指的是第一个存储位置的第一个数组元素。然后元素依次是 A(1,1), A(2,1), A(3,1), ..., A (N-1,1), A(N,1), A (1,2), A(2,2), ... 直到 A(N,M)。

假设在 C 端,您有一个指向第一个元素的指针。让我们假设这个指针是ap

那么,ap[0] 会引用A(1,1)ap[1] 会引用A(2,1) 等等。一般来说,如果你想在 Fortran 端引用A(I,J),你必须引用ap[(i-1)+n*(j-1)] on C 面。当然,在 C 方面,在 C 中使用从零开始的访问会更符合理念。

所以,如果你想为 Fortran 构造一个数组,看起来像

A = | 1 4 |
    | 2 5 |
    | 3 6 |

您可以使用以下 C 代码:

   int n=3, m=2;
   int count = 1,
   for (i=0; i<n; i++)
     {
        for (j=0; j<m; j++)
         {
           ap[i+n*j] = count;
           count ++;
         }
     }

复数在 Fortran 中很容易 - 实部​​和虚部位于两个连续的存储位置。你可以在你的程序中使用它。 COMPLEX*16 是一种旧的、非标准的双精度复数形式。

围绕 zhpadm.f 编写一个包装函数是有意义的。使该函数 bind(C) 并让它为 zhpadm 保留所需的工作空间。

如需更多提示,请阅读https://stackoverflow.com/tags/fortran-iso-c-binding/info

【讨论】:

    猜你喜欢
    • 2015-10-11
    • 1970-01-01
    • 1970-01-01
    • 2015-01-13
    • 1970-01-01
    • 2010-12-23
    • 1970-01-01
    • 2012-11-18
    • 2011-09-05
    相关资源
    最近更新 更多