2016-02-26 40 views
1

好吧,昨天我有一位同事來到我的辦公室,問我一個關於他必須使用的Fortran代碼的問題。任何理由只傳遞第一個元素而不是整個數組?

基本上,他使用的代碼有一個很長的多維數組,以及一個期望這個長的多維數組作爲參數的子例程。

但是,調用該子例程的代碼只能傳遞數組的第一個元素。然而,代碼的作品。所以他問我怎麼可能。

我還沒有看到他的特殊的代碼,但在這裏就是我所理解的問題的示例(和它的作品!):

subroutine print_array(a) 
    implicit none 
    integer :: a(10) 
    write(*, *) a 
end subroutine print_array 

program passing 
    implicit none 
    integer :: i(10) 
    i = (/ 1, 2, 3, 4, 5, 6, 7, 8, 9, 10 /) 
    call print_array(i(1)) 
end program passing 

所以我告訴他,Fortran的商店陣列順序和位置該數組與第一個元素相同,並且由於該子例程需要某種形狀,因此它知道沿着該序列讀取多遠,依此類推。

我還告訴他,這是不好的編程習慣,他不應該自己寫這種代碼。

但從那以後我一直在想:爲什麼寫這個的人會這樣做呢?是否有任何理由這樣做? (它甚至不一定是一個很好的理由。)

或者我是對的,這是愚蠢的,太容易出錯?

+0

令人驚訝,但合法! –

回答

1

你對這個工作原理的解釋是正確的。你厭惡遵循這種過時的做法得到廣泛支持。

至於原因,我忘了(雖然很久以前我習慣了做 - 就像從酒吧和吸菸開車回家的路上,每個人都做了,以爲沒事的話),但也許是語言的最早版本不支持將整個數組作爲參數傳遞。也許別人的腦子不會被酒,菸草和FORTRAN的強烈組合所迷惑(沒錯,大聲喊出)會更清楚地記得。

+0

如果您將Fortran視爲低級語言(或高級程序集),則這種喧賓奪主的做法很有意義。當你傳遞第一個元素的地址時,如果你將數組的聲明從'i(10)'改變爲'i(0:10)',那麼傳遞'i(1)'不會破壞你的代碼,我會將數組移位1個元素。如果你傳遞'i(1:10)',編譯器可能會創建一個數組的臨時副本(儘管我不確定它現在仍然如此),這會降低執行速度。 –

+0

我不買這個解釋。但好處是臨時數組是不可能的,這對於非阻塞MPI是有利的。但我仍然傳遞整個數組,而不是使用MPI子數組數據類型。 –

相關問題