[英]Passing subarray of 2-dimensional array in FORTRAN-77
我有二維數組
real triangle(0:2, 0:1)
其中“三角形”是一個向量數組(一維數組),我也有子程序
subroutine vecSub(lhs, rhs, result)
real lhs(0:1), rhs(0:1), result(0:1)
result(0) = lhs(0) - rhs(0)
result(1) = lhs(1) - rhs(1)
return
end
有沒有辦法將“三角形”變量中的向量之一傳遞給這個子程序? Fortran-90 可以做到這一點: triangle(0, :)
給出第一個三角形數組,但我只允許使用 FORTRAN-77,所以這不行,有什么建議嗎?
@Javier Martin 寫道“不使用您的陣列的當前布局”,但錯過了提出替代方案的機會。
如果您改為如下聲明變量:
real triangle(0:1, 0:2)
顛倒邊界的順序,然后您可以將triangle(0,0)
、 triangle(0,1)
或triangle(0,2)
傳遞給子程序並獲得您想要的准確行為,這是由於名為“序列”的 Fortran 功能協會”。 當您將單個數組元素傳遞給作為數組的虛擬參數時,您將按數組元素順序隱式傳遞該元素和后續元素。 這是對正常 Fortran 形狀匹配規則唯一允許的違反,並且是 FORTRAN 77 的一部分。
不,不是與您的陣列的當前布局,因為兩個原因:
(n,m,l)
的數組中(n,m,l)
元素之間的距離(步幅)是(1,n,m)
,以數組元素為單位(即,不是字節)。a(:)
,它們通常通過傳遞一個小的描述符結構來實現,該結構傳達諸如步幅或元素數量之類的細節。 相反,您只能使用假定長度的數組a(*)
,它通常是指向第一個元素的指針,有點像 C 數組。 您必須將長度作為單獨的參數傳遞,並且數組元素必須是連續的這就是為什么您可以將子數組“傳遞給 F77 子程序”的原因,只要該子數組是例如矩陣列:其中的元素是連續的。
一種可能的解決方案(許多當前的 Fortran 編譯器實現的解決方案)是,當您嘗試將非連續子數組傳遞給未知接受它們的函數時,它們會復制該數組,甚至將其寫回到內存中如果需要的話。 這相當於:
! Actual array
integer m(3,5)
integer dummy(5)
dummy = m(2,:)
call myF77sub(dummy, 5)
m(2,:) = dummy
但是,正如其他人所說,您應該盡量不要直接調用 F77 函數,而是要使它們適應或至少將它們包裝在更新的 Fortran 接口中。 然后,您可以在包裝器中使用上述代碼,並從現代 Fortran 例程“正常”調用該包裝器。 然后,您最終可能會在不影響客戶端代碼的情況下改寫現代 Fortran 中的實際實現。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.