我有一个项目是C的一半,Fortran 77的一半。[不,不是Fortran 90或03,Fortran 77.]如果我能将C侧生成的指针传递给Fortran,代码会更清晰,然后根据需要将它们传回给其他C函数处理。实际上,C代码中填充的全局变量不应该是全局变量,否则就会变成非结构化的混乱。那么有没有合理可靠的方法在C和Fortran之间传递不透明的指针?
答案 0 :(得分:2)
如果您使用的是32位平台,请考虑将指针转换为整数并将这些整数传递给Fortran代码。当Fortran将它们传回时,将整数重新转换回指针,交叉指针并使用。
从我记忆中(从25年前开始),Fortran 77倾向于通过指针将所有内容传递给C - 并且字符串以长度传递,并且数组以其尺寸传递。
如果您使用的是64位平台,则必须确定Fortran 77编译器是否提供任何8字节整数(INTEGER * 8?) - 我的怀疑是它不会(很大程度上已确认)通过查看GNU documentation;如果您使用的是Fortran 2003,那么您的状态会更好。如果确实如此,同样的伎俩也有效。如果没有,你就会陷入更加渺小的境地。
你可以尝试 - 反对建议 - 使用double和指针的并集。在C中,你可以从你的C代码指针设置联合中的指针,然后将双关联复制到一个Fortran REAL * 8中,只要没有人接触它,除了复制它或传递它回来,如果众神对你的努力表示赞赏,也许你会好的。但最有可能的是,整个事情都会爆炸 - 这种联盟有一种令人难以置信的能力,可以检测到当某些东西不起作用时客户会最烦恼,然后在恰当的时刻继续爆炸 - 通过演示的一部分,或节目上线后十五分钟。
考虑的另一种选择(仍然带有咬牙切齿)是64位指针和两个32位整数数组的并集,然后当需要返回时需要Fortran代码传递两个整数的数组一个(64位)指针。显然,一个整数的数组将适用于32位代码;也许只需要调用代码在所有情况下都传递一个包含两个整数的数组,将32位指针大小写中未使用的整数值归零?这可以让你向前移动。
答案 1 :(得分:0)
您可以使用(非标准)Cray指针扩展名执行此操作: