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

因此,我已经被委托将一些fortran子程序转换为C.这些子程序被称为主要在C中的大型程序的控制流程的一部分。

我正在逐个翻译函数,从调用堆栈顶部的函数开始。

我面临的问题是将数据从C传递到fortran。

假设我们在c中声明了一个数组

int* someCArray = (int*)malloc( 50 * 4 * sizeof(int) ); 

现在,需要将此数组传递给fortran子例程以填充数据

 someFortranFunc( someCArray, someOtherParams ); 

当数组到达fortran land时,它被声明为一个可变大小的矩阵:

 subroutine somefortranfunc(somecarray,someotherparams) integer somefarray(50,*) 

问题是fortran似乎没有正确调整数组大小,因为程序seg-faults。 当我调试程序时,我发现索引到

 somefarray(1,2) 

报告这是一个无效的索引。 对第一列中任何项的任何引用都可以正常工作,但是当它到达fortran时,数组中只有一个可用列。

我无法真正改变这是fortran中可变大小数组的事实。 任何人都可以解释这里发生的事情,有没有办法可以从C方面缓解问题?

[编辑]

顺便说一下,fortran子程序是从替换的fortran代码中调用的

 integer somedatastorage(plentybignumber) integer someindex ... call somefarray(somedatastorage(someindex)) 

其中数据存储是一个大的1d数组。 超出数据存储大小没有问题。 不过,不知何故,传递C数组和fortran(子)数组之间的差异导致了fortran子例程的差异。

谢谢!

您是否考虑过Fortran ISO C绑定? 我已经有了非常好的结果,可以在两个方向上连接Fortran和C. 我的偏好是避免重写现有的,经过测试的代码。 有一些类型无法使用当前版本的ISO C绑定进行传输,因此可能需要进行转换。

其他人建议的不应该是:1。int的大小与Integer的大小。 由于第一列具有正确的值。 2.行与列排序。 只会以错误的顺序获取值而不会出现细分错误。 3.参考与价值传递。 由于第一列具有正确的值。 除非编译器在你背后做一些邪恶的事情。

你确定你不是以某种秘密的方式做到这一点吗?:

  someCArray++ 

在你做出之后立即打印出someCArray指针的值,然后再传递它。 您还应该使用fortran代码中的调试器将其打印出来,以validation编译器是否未生成一些临时副本来帮助您。