2 回答

TA貢獻1719條經(jīng)驗 獲得超6個贊
最佳實踐是將過程(子例程和函數(shù))放在模塊中,然后從主程序或其他過程中“使用”該模塊。您無需從同一模塊的其他過程中“使用”該模塊。這將使過程的接口更明確,以便調(diào)用程序或過程“知道”參數(shù)的特征……它允許編譯器檢查雙方參數(shù)之間的一致性……調(diào)用者和被調(diào)用者。消除了許多錯誤。
超出語言標準,但實際上是必需的:如果使用一個文件,請將模塊放在使用它的主程序之前。否則,編譯器將不會意識到這一點。所以:
module my_subsimplicit nonecontainsFUNCTION cross(a, b) INTEGER, DIMENSION(3) :: cross INTEGER, DIMENSION(3), INTENT(IN) :: a, b cross(1) = a(2) * b(3) - a(3) * b(2) cross(2) = a(3) * b(1) - a(1) * b(3) cross(3) = a(1) * b(2) - a(2) * b(1)END FUNCTION crossend module my_subsPROGRAM crosstest use my_subs IMPLICIT NONE INTEGER, DIMENSION(3) :: m, n INTEGER, DIMENSION(3) :: r m= [ 1, 2, 3 ] n= [ 4, 5, 6 ] r=cross(m,n) write (*, *) rEND PROGRAM crosstest

TA貢獻1848條經(jīng)驗 獲得超10個贊
這是一個較晚的答案,但是由于我偶然發(fā)現(xiàn)了這個問題,并且還沒有真正的解釋為什么會出現(xiàn)您的錯誤,所以我想為其他偶然發(fā)現(xiàn)這個問題的人添加一個解釋:
在您的程序中,定義一個名為的數(shù)組cross
,該數(shù)組的等級為1。然后調(diào)用cross
您定義的函數(shù)。由于該cross
函數(shù)沒有顯式接口(請參見MSB的答案),因此編譯器此時尚不知道該接口。它所知道的是您聲明的數(shù)組。如果編寫r = cross(m, n)
,則編譯器認為您要訪問數(shù)組位置(m,n)處的元素cross
。由于此數(shù)組的等級為1,但是您提供了兩個參數(shù),因此會出現(xiàn)錯誤
rank mismatch in array reference at (1) (2/1)
這意味著當編譯器期望一個坐標時,您提供了兩個坐標。
添加回答
舉報