所以,我已经委托将一些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子例程的差异。
谢谢!
我不清楚您是否遇到行 - 主要/列主要问题(请参阅http://stackoverflow.com/q/4083490/2509)或者具有fortran中未指定维度的含义。或两者。 – dmckee
也许你可以发布一些更完整的代码,从片段到目前为止它实际上看起来很好,我想。 – haraldkl
我了解行/列主要问题以及1/0索引问题。这个问题似乎与可变大小的fortran阵列有关。我将有效数据传递到子例程中,数据按列主要顺序排列。看起来fortran正在截断矩阵的所有列,但只有一列。 – dusktreader