2017-10-11 81 views
2

我目前正在翻譯一些遺留的fortran代碼,並且我很難理解代碼中的特定行。編譯器似乎也發現這一行很奇怪,並拋出一個錯誤。據我所知,它試圖初始化一個數組,通過以1爲增量對1到9進行排序,並用列主要形式的這個序列填充數組矩陣。在Fortran中初始化一個具有序列的數組

program arrayProg 

    integer :: matrix(3,3), i , j !two dimensional real array 

    matrix = reshape((/1:9:1/), (/3,3/)) 

end program arrayProg 

這個語法在fortran中可以接受嗎? (它必須是因爲它來自遺留代碼) 我是否誤解了該行的功能?

+0

編譯器發現了什麼樣的錯誤?哪個編譯器?請看[ask]和[mcve],你應該總是提供你所有的信息。錯誤的消息我們非常重要。語法不正確。 –

回答

4

語法不正確,並且Fortran編譯器無法編譯此類代碼,除非它實現了一些非標準擴展。

英特爾Fortran接受這一點:

A colon-separated triplet (instead of an implied-DO loop) to specify a range of values and a stride; for example, the following two array constructors are equivalent: 
1  INTEGER D(3) 
2  D = (/1:5:2/)    ! Triplet form - also [1:5:2] 
3  D = (/(I, I=1, 5, 2)/)  ! implied-DO loop form 

https://software.intel.com/en-us/node/678554

要生成一個標準的方式序列中的一個使用一個隱含的DO循環像

(/ (i, i=1,9) /) 

的重塑不僅僅是改變按照您猜測的主要順序,將一維數組轉換爲二維數組。

+3

順便說一句,每當有人推薦在新代碼中使用一些非標準的擴展,尤其是像DEC擴展那樣的醜陋的東西時,請考慮一下這樣的情況。有人會繼承這些代碼,會得到一些不同的編譯器,並且會被搞砸或至少讓人困惑,並且PIA會將代碼重寫爲標準格式。你不能說「它是可移植的,因爲我總是使用英特爾,這是無稽之談。」 –

+0

同意,但在這種情況下,現代Fortran具有完全可用的整數序列生成語法,只能在數組索引上使用,這實在令人惱火。嘗試使用這種方法創建整數序列是很自然的,只是發現一個被迫使用隱含DO循環來保持語言標準(翻譯:我被這個咬了。)這就是爲什麼我建議編碼即使你不打算使用結果,也可以使用多個編譯器;您會收到非標準擴展的快速通知。 – arclight