因此,我受委托(delegate)将一些 Fortran 子例程翻译成 C。这些子例程作为主要基于 C 的大型程序的控制流的一部分被调用。
我一次翻译一个函数,从位于调用堆栈顶部的函数开始。
我面临的问题是数组数据从 C 到 Fortran 的传递。
假设我们在 c 中声明了一个数组
int* someCArray = (int*)malloc( 50 * 4 * sizeof(int) );
现在,这个数组需要传递到一个 fortran 子例程中以填充数据
someFortranFunc( someCArray, someOtherParams );
当数组到达 fortran 领域时,它被声明为一个可变大小的矩阵:
subroutine somefortranfunc(somecarray,someotherparams)
integer somefarray(50,*)
问题是 fortran 似乎没有正确调整数组大小,因为程序段错误。当我调试程序时,我发现索引到
somefarray(1,2)
报告这是一个无效索引。对第一列中任何项目的任何引用都可以正常工作,但当它到达 fortran 时,数组中只有一个可用列。
我真的无法改变这是 Fortran 中可变大小数组的事实。谁能解释这里发生了什么,有没有办法从 C 方面缓解问题?
[编辑]
顺便说一下,fortran 子例程是从替换的 fortran 代码中调用的
integer somedatastorage(plentybignumber)
integer someindex
...
call somefarray(somedatastorage(someindex))
其中数据存储是一个大的一维数组。超出数据存储的大小没有问题。但是,不知何故,传递 C 数组和 fortran(子)数组之间的差异导致了 fortran 子例程的差异。
谢谢!
最佳答案
您是否考虑过 Fortran ISO C 绑定(bind)?我用它在两个方向上连接 Fortran 和 C 获得了很好的结果。我的偏好是避免重写现有的、经过测试的代码。有一些类型无法通过当前版本的 ISO C 绑定(bind)进行传输,因此可能需要进行翻译。
关于c - 将 c 数组作为可变大小的矩阵传递给 fortran,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7352922/