2011-09-08 41 views
4

所以,我已经委托将一些fortran子例程翻译为C.这些子例程被称为主要基于C的大数据块的控制流的一部分。将c数组作为可变大小矩阵传入fortran

我一次翻译一个函数,从调用堆栈顶部的函数开始。

我面临的问题是从C到fortran的数组数据的交接。

假设我们已经宣布在C数组作为

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

现在,这个阵列需要向下传递到FORTRAN子程序,用数据来填充

someFortranFunc(someCArray, someOtherParams); 
当阵列到达

fortran土地,它被宣布为一个可变大小矩阵:

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)) 

其中数据存储为一个大的一维数组。超出数据存储的大小没有问题。不过,不管怎么样,传递C数组和Fortran(子)数组之间的差异导致fortran子例程的差异。

谢谢!

+1

我不清楚您是否遇到行 - 主要/列主要问题(请参阅http://stackoverflow.com/q/4083490/2509)或者具有fortran中未指定维度的含义。或两者。 – dmckee

+0

也许你可以发布一些更完整的代码,从片段到目前为止它实际上看起来很好,我想。 – haraldkl

+0

我了解行/列主要问题以及1/0索引问题。这个问题似乎与可变大小的fortran阵列有关。我将有效数据传递到子例程中,数据按列主要顺序排列。看起来fortran正在截断矩阵的所有列,但只有一列。 – dusktreader

回答

2

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

+2

我真的不想改善绑定。由于我正在替换fortran子例程,因此我只需在新C例程和其余Fortran例程之间的交接中保留数据的完整性。 – dusktreader

+0

我认为M. S. B.的意思是,不是将fortran的东西重写到C,而是将这些例程与主C程序进行接口,我完全同意。 – steabert

+3

这不是我的选择或原始问题的实际答案。 Fortran的搬迁是在我被委托开展这个项目之前做出的决定。子程序已经在C和Fortran之间进行了良好的接口。我的工作是重写,所以这就是我所追求的。不过,我很欣赏这个建议和见解,所以我不会低估答案。 – dusktreader

2

它不应该是别人建议的: 1.整数的大小与整数的大小。由于第一列有正确的值。 2.行与列排序。只会以错误的顺序获取值而不会分段错误。 3.参考值与值传递。由于第一列有正确的值。除非编译器在背后做了一些邪恶的事情。

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

someCArray++ 

打印出刚好在你传递它之后的someCArray指针的值。您还应该使用Fortran代码中的调试器将其打印出来,以验证编译器是否不生成一些临时副本来帮助您。