gpt4 book ai didi

c - 在结构中的数组末尾填充

转载 作者:太空宇宙 更新时间:2023-11-04 08:34:46 25 4
gpt4 key购买 nike

我问了以下有关 FORTRAN/C 链接的问题 Passing a FORTRAN object to C and vice versa还有一个问题是关于 C 的。

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

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 代码。为了让我在“x”之后访问“max_steps”,它需要我放置虚拟变量 a、b、c、d、e(以通过我猜测的填充)。

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. 如果只是结构填充,它可能会非常随机。 Fortran 允许根据需要放置组件,但要求 C 不更改成员的顺序。这就是为什么您应该使用强制执行 C 行为的 bind(C)

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

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

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

关于c - 在结构中的数组末尾填充,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26716938/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com