因此,我受委托将一些 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 方面缓解这个问题?
[edit]
顺便说一句,fortran 子例程是从替换的 fortran 代码中调用的,如下所示
integer somedatastorage(plentybignumber)
integer someindex
...
call somefarray(somedatastorage(someindex))
其中数据存储是一个大型一维数组。不存在超出数据存储大小的问题。但不知何故,传递 C 数组和 fortran(子)数组之间的差异导致了 fortran 子例程的差异。
Thanks!