簡體   English   中英

在 FORTRAN-77 中傳遞二維數組的子數組

[英]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 的一部分。

,不是與您的陣列的當前布局,因為兩個原因:

  • Fortran 使用數組元素順序,其中最左邊的維度是連續的。 也就是說,在大小為(n,m,l)的數組中(n,m,l)元素之間的距離(步幅)是(1,n,m) ,以數組元素為單位(即,不是字節)。
  • F77 不包括假定形狀數組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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM