所以,我已被委托将一些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子例程的不同。
谢谢!
答案 0 :(得分:2)
您是否考虑过Fortran ISO C绑定?我在两个方向上连接Fortran和C都有很好的结果。我的偏好是避免重写现有的,经过测试的代码。有一些类型无法使用当前版本的ISO C绑定进行传输,因此可能需要进行翻译。
答案 1 :(得分:2)
其他人建议的不应该是: 1. int的大小与Integer的大小。由于第一列具有正确的值。 2.行与列排序。只会以错误的顺序获取值而不会出现细分错误。 3.参考与价值传递。由于第一列具有正确的值。除非编译器在背后做一些邪恶的事情。
您确定不以某种秘密方式执行此操作吗?:
someCArray++
在您创建之后立即打印出someCArray指针的值,然后再传递它。您还应该使用fortran代码中的调试器将其打印出来,以验证编译器是否没有生成一些临时副本来帮助您。