2011-09-08 38 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代碼中的調試器將其打印出來,以驗證編譯器是否不生成一些臨時副本來幫助您。