在结构中的数组末尾填充

时间:2014-11-03 15:04:27

标签: c arrays struct fortran padding

我在FORTRAN / C链接Passing a FORTRAN object to C and vice versa上提出了以下问题,并提出了另一个与C有关的问题。

有人可以解释在结构末尾填充数组的原因吗?我在C中从FORTRAN获取对象并定义struct和substructs:

struct ginfo {
  int printproc;  
  double *x;
};

struct sinfo {
  double a,b,c,d,e;
  int max_steps;
};

struct cons {
  struct ginfo  pointer1; 
  struct sinfo pointer2; 
};

extern void printc_(struct cons *v)
{
    double *t1;
    int u,w;

    u = v -> pointer1.printproc;
    t1 = v -> pointer1.x;
    w = v -> pointer2.max_steps;
}

这是我的C代码。让我访问" max_steps"在" x"之后,它需要我把虚拟变量a,b,c,d,e(为了通过填充,我是GUESSING)。

Fortran代码

TYPE Storage
     INTEGER :: printproc
     REAL*8, DIMENSION(:)  , ALLOCATABLE     :: x
END TYPE Storage


TYPE Storage1
     INTEGER :: max_steps
END TYPE Storage1

TYPE example
    TYPE(Storage)   :: JAC
    TYPE(Storage1)   :: MAT
END TYPE example

  TYPE(example)                          :: cons

ALLOCATE(cons%JAC%x(1:10))

cons%JAC%x(:) = 1.23

 call printc( cons )

我在问我为什么需要填充?为什么它总是不变的,无论" x"?

的大小

仅供参考:我不用C

编码

1 个答案:

答案 0 :(得分:2)

  1. 如果它只是结构填充,它可能是非常随机的。 Fortran可以根据需要定位组件,但C不需要更改成员的顺序。这就是为什么你应该使用强制执行C行为的bind(C)

  2. 使用SEQUENCE时,填充为零。问题是难以在C中强制执行此操作。

  3. 主要原因。 ALLOCATABLE数组与C指针完全相同。这是一个非常困难的描述符,它有许多字段(所有维度的大小,所有维度的第一个索引,......),并且它可以在编译器之间有所不同。所以你的填充实际上只是掩盖了描述符的各个部分,直到你幸运地找到了指向数据的真实指针。你很幸运,allocatable数组必须是连续的,所以最终它可能会起作用。

  4. 为什么它与大小无关?因为它是一个指针。实际数据在其他地方。在C和Fortran都有。在Fortran中,除了地址之外还有描述符的其他部分,但它仍然只是一种指针。