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

时间:2011-09-08 18:41:35

标签: 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(sub)数组之间的差异导致了fortran子例程的不同。

谢谢!

2 个答案:

答案 0 :(得分:2)

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

答案 1 :(得分:2)

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

您确定不以某种秘密方式执行此操作吗?:

   someCArray++

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