在FORTRAN可以聲明與任何合適的(積分)的範圍的陣列,例如:負陣列索引和放置在存儲器(定點)
real* 8 array(-10:10)
相信FORTRAN,通過引用傳遞時,始終將傳遞數組(1)作爲參考,但我不確定。我使用的是Fortran指針,我相信Fortran指向「1st」元素地址,即數組(1),而不是數組(-10)。但我不確定。
Fortran如何處理內存中負數組索引?它是否有助於定義?
編輯:爲了增加更多的細節,我通過使用fortran指針指向地址,通過從內部調用fortran例程完成,將C的malloc'd塊傳遞給fortran CIE Ç雲:
void * pointer = malloc(blockSize*sizeof(double));
fortranpoint_(pointer);
而且FORTRAN點例行的樣子:
real*8 :: target block(5, -6:6, 0:0)
real*8 :: pointer array(:,:,:)
entry fortranPoint(block)
array => block
return
的問題是,有時當它後來試圖訪問說:
array(1, -6, 0)
我不知道,如果這是訪問該塊的開始或之前的地址。我現在認爲這是實現定義的,但想知道每個實現的細節。
使用ISO_C_BINDING是否需要我更改Fortran中使用的數據類型?我簡單地看了一下,我無法分辨。我是一名C程序員,不得不與一些Fortran一起工作,我無法像改變數據類型那樣大規模地編輯它。 – VolatileStorm
那麼,你需要確保類型和種類相匹配,是的。但我不認爲這是一個特別大的問題。例如。如果C代碼使用雙精度,那麼ISO_C_BINDING的東西應該使用REAL(kind = C_DOUBLE),然後您需要確保REAL(kind = C_DOUBLE)與您綁定的Fortran過程使用的類型相同。請注意,種類只是整數參數;在今天的大多數編譯器上,KIND(1.0d0)== C_DOUBLE == selected_real_kind(15)== 8,所以很有可能你很好走。 – janneb
ISO_C_BINDING在我的一個目標平臺上不存在,所以我不能編寫涉及它的代碼,很不幸。你有什麼想法在哪裏我可以找到詳細的信息,哪些編譯器做什麼數組?與此同時,我還沒有聽說過「隱式」和「顯式」接口。他們的意思是什麼? 謝謝! – VolatileStorm