我在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
编码答案 0 :(得分:2)
如果它只是结构填充,它可能是非常随机的。 Fortran可以根据需要定位组件,但C不需要更改成员的顺序。这就是为什么你应该使用强制执行C行为的bind(C)
。
使用SEQUENCE
时,填充为零。问题是难以在C中强制执行此操作。
主要原因。 ALLOCATABLE
数组与C指针完全相同。这是一个非常困难的描述符,它有许多字段(所有维度的大小,所有维度的第一个索引,......),并且它可以在编译器之间有所不同。所以你的填充实际上只是掩盖了描述符的各个部分,直到你幸运地找到了指向数据的真实指针。你很幸运,allocatable
数组必须是连续的,所以最终它可能会起作用。
为什么它与大小无关?因为它是一个指针。实际数据在其他地方。在C和Fortran都有。在Fortran中,除了地址之外还有描述符的其他部分,但它仍然只是一种指针。