1

我有一个项目,一半是 C 语言,一半是 Fortran 77。[不,不是 Fortran 90 或 03,Fortran 77。] 如果我可以将 C 端生成的指针传递回 Fortran,代码会更简洁,这将然后根据需要将它们传回以在其他 C 函数中处理。事实上,C 代码中充满了不应该是全局的全局变量,否则就会变得一团糟。那么是否有任何合理可靠的方法可以在 C 和 Fortran 之间传递不透明的指针?

4

2 回答 2

2

如果您在 32 位平台上,请考虑将指针转换为整数并将这些整数传递给 Fortran 代码。当 Fortran 将它们传回时,将整数重新转换回指针,交叉手指,然后使用。

据我记得(从 25 多年前开始),Fortran 77 倾向于通过指针将所有内容传递给 C - 字符串以长度传递,数组以维度传递。

如果您在 64 位平台上,则必须确定 Fortran 77 编译器是否提供任何 8 字节整数(INTEGER * 8?) - 我怀疑它不会(很大程度上通过查看GNU 文档;如果您使用的是 Fortran 2003,您的状态会更好,看来)。如果是这样,同样的技巧也有效。如果没有,你就进入了更加狡猾的领域。

您可以尝试 - 反对建议 - 使用双精度和指针的联合。在 C 中,您可以从 C 代码指针中设置联合中的指针,然后将联合中的双精度复制到 Fortran REAL*8 中,并且只要没有人触摸它,除非复制或传递它回来,如果上帝对你的努力微笑,也许你会没事的。不过,最有可能的是,整个事情都会爆炸——这种联合具有令人难以置信的能力,可以检测到如果某些东西不起作用,客户何时会最生气,然后会在正确的时刻继续爆炸——通过演示的一部分,或节目上线十五分钟后。

要考虑的替代方法(仍然咬牙切齿)是 64 位指针和两个 32 位整数数组的并集,然后当您需要返回 (64 -bit) 指针。显然,一个整数数组适用于 32 位代码;也许只需要调用代码在所有情况下都传递一个由两个整数组成的数组,在 32 位指针的情况下将未使用的整数值归零?这为您提供了向前迁移的能力。

于 2009-10-16T21:18:41.940 回答
0

您可以使用(非标准)Cray 指针扩展来做到这一点:

http://gcc.gnu.org/onlinedocs/gfortran/Cray-pointers.html

于 2010-01-14T23:07:05.713 回答