我想使用用C语言编写的fortran77中的'expokit'包。我确实在我的linux系统上安装了f2c,并将zhpadm.f文件翻译成了zhpadm.c。接下来我应该做什么来对C中的矩阵求幂。我应该在主C程序中包含哪些文件?
如何将参数传递给C中的函数zhpadm()?我的问题是2d数组。我不知道如何通过这些,我不知道如何传递复数。对于真正的1d阵列,它可以工作。
我正在使用gfortran和gcc。
答案 0 :(得分: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)
,你必须在C方面引用ap[(i-1)+n*(j-1)]
。当然,在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周围编写包装函数是有意义的。使该函数绑定(C)并使其为zhpadm保留所需的工作空间。
如需进一步提示,请阅读https://stackoverflow.com/tags/fortran-iso-c-binding/info。