c - F77 中的不透明指针

标签 c fortran77

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

最佳答案

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

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

如果您使用的是 64 位平台,则必须弄清楚 Fortran 77 编译器是否提供任何 8 字节整数(INTEGER*8?)——我怀疑它不会(已基本确认)通过查看 GNU documentation ;如果您使用的是 Fortran 2003,您的状态似乎会更好)。如果是这样,同样的技巧也有效。如果没有,您将进入更加危险的领域。

您可以尝试 - 反对建议 - 使用 double 和指针的 union 。在 C 中,您将从 C 代码指针中设置 union 中的指针,然后将 union 中的 double 复制到 Fortran REAL*8 中,只要没有人触及它,除了复制它或传递它回来,如果众神对你的努力微笑,也许你会没事的。不过,最有可能的是,整个事情都会爆发——这种 union 有一种令人难以置信的能力,可以检测到如果某些东西不起作用,客户什么时候最恼火,然后会在正确的时刻继续爆发——演示的一部分, 或节目上线十五分钟后。

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

关于c - F77 中的不透明指针,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1580164/

相关文章:

c - 如何使用strcpy收集变量

c - 如何在 MacOS 11.1 上使用 Homebrew 安装 libuuid?

c - 将函数定义放在 main() 之后是否比将它们放在 main() 之前有任何优势?

algorithm - 在 Fortran 中重新启动循环

fortran - Fortran 95 编译器可以编译 Fortran 77 代码吗?

Fortran 运行时错误 : Bad real number in item 1 of list input

c++ - 在没有 CRT 的情况下转换 DWORD,实现自定义 sprintf() 函数

c - 创建头文件的问题

python - 这段 Fortran 77 代码的意图是什么?

linux - 我在哪里可以获得在 redhat linux 上安装 f2c 的文件?