将复杂c函数转换为fortran

时间:2017-12-08 02:41:59

标签: c fortran gfortran

我正在将一些c函数转换为fortran。在我的c例程中,有两个结构定义,如下面的

typedef struct heapnode {
              double c;
              int n;
                    } heapnode;

typedef struct heap {
                int n;
                int sz;
                heapnode *d;
                    } heap;

我将以上两种类型定义转换为fortran,如下所示,效果很好。

type heapnode

    real*8 :: c
    integer*4 :: n

   endtype heapnode


  type heap

    integer*4 :: n
    integer*4 :: sz
    type(heapnode), pointer :: d

  endtype heap

我的问题是关于启动上述两种结构。这里的要求是我们应该有一个堆类型变量和with-in这个堆类型变量我们应该有多个堆节点。

为了证明这一点,我在下面展示了c代码来打印堆元素

int i;

   FILE *f = stdout;
   fprintf(f, "Printing heap\n");

   for (i=0; i<h->n; i++) {
     fprintf(f, "[%4d]: n = %5d, c = %17.12lg\n", i, h->d[i].n, h->d[i].c);
   }

在上面的代码中,h是堆类型变量 h-&gt; n是堆变量h

中的堆节点数

在这里,我们可以看到访问堆节点变量为h-&gt; d [i]

我展示了用于创建此堆变量的c代码和

下面的节点
 void *vspace, *oldvspace;

   heap *h  /* heap */
   heapnode *d; /* heap node */


   h->n = 0; 
   h->sz = 8;

   oldvspace = (void *) h;
   vspace = (void *)(h + 1); / * address of next node */

   d = (heapnode *)vspace; / *point heapnode to above address */
   h->d = d;  /  *assign heapnode to new node */

我们在上面看到的是在特定的内存位置创建一个变量(这次是heapnode),并将指针变量指向该变量。

我想知道,我们如何使用fortran来做到这一点。能否请你给我一些提示呢。

1 个答案:

答案 0 :(得分:0)

标准Fortran中没有指针运算。然而,编译器中有一个非标准的扩展,称为“Cray指针”。这将允许有限的指针算术。请注意,Cray指针算法与C风格指针算法不同 - 使用Cray指针递增指向派生类型的指针不会产生等于原始内存位置的指针值加上存储派生类型所需的字节数。因此,vspace = (void *)(h + 1);之类的语句无法完全模拟。如果您希望您的代码可移植,那么我不推荐使用Cray指针。