c - 将 c 数组作为可变大小的矩阵传递给 fortran

标签 c fortran

因此,我受委托(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/

相关文章:

gcc - Fortran 77 提示常见 block

multidimensional-array - 复制到另一个可分配数组后,Fortran 不会保留数组的下界/上界

C语言 : remove the last element of a vector

c - C中命令行的参数处理

c 警告 - 从不兼容的指针类型传递 ‘insert’ 的参数 1

FORTRAN 中子程序的指针

c - 在二叉搜索树中插入第二个节点时程序崩溃

c - getint 函数出现段错误错误

arrays - Fortran中0大小数组的数组边界

控制 C 代码中的操作顺序