在Fortran 90中計算兩個向量的叉積我想在Fortran 90中計算兩個向量的叉積。例如,換句話說,(1、2、3)和(4、5、6)的叉積變成(-3、6 -3)以直角坐標表示。我編寫了以下代碼(主程序后跟函數定義):PROGRAM crosstest
IMPLICIT NONE
INTEGER, DIMENSION(3) :: m, n
INTEGER, DIMENSION(3) :: cross
INTEGER, DIMENSION(3) :: r
m=(/1, 2, 3/)
n=(/4, 5, 6/)
r=cross(m,n)END PROGRAM crosstestFUNCTION 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 cross但是,我收到一條錯誤消息:crosstest.f90:10.9:
r=cross(m,n)
1Error: Rank mismatch in array reference at (1) (2/1)第10行在哪里r=cross(m,n)。看來我必須指定了錯誤的尺寸。這是我的一些想法:也許cross在主程序中函數的聲明應該只是一個整數變量,而不是1by3整數數組。所以,我想刪除, DIMENSION(3)的INTEGER, DIMENSION(3) :: cross主程序線。但是我收到一條錯誤消息:crosstest.f90:10.4:
r=cross(m,n)
1Error: The reference to function 'cross' at (1) either needs anexplicit INTERFACE or the rank is incorrect所以這可能更糟。Web上的一些(但不是全部)Fortran函數示例在EXTERNAL主程序中的函數聲明之后放置了一條語句。因此,我嘗試EXTERNAL cross在主程序中的聲明塊之后放置一行。我收到一條錯誤消息:crosstest.f90:8.16:
EXTERNAL cross
1Error: EXTERNAL attribute conflicts with DIMENSION attribute at (1)因此,這似乎也不正確。Web上的一些(但不是全部)Fortran函數示例在RETURN函數定義的倒數第二行上放置了一條語句。我嘗試了此操作,但出現了原始排名不匹配錯誤:crosstest.f90:10.9:
r=cross(m,n)
1Error: Rank mismatch in array reference at (1) (2/1)因此,這不能解決問題。您能幫我看看我的錯誤嗎?
2 回答

慕俠2389804
TA貢獻1719條經驗 獲得超6個贊
最佳實踐是將過程(子例程和函數)放在模塊中,然后從主程序或其他過程中“使用”該模塊。您無需從同一模塊的其他過程中“使用”該模塊。這將使過程的接口更明確,以便調用程序或過程“知道”參數的特征……它允許編譯器檢查雙方參數之間的一致性……調用者和被調用者。消除了許多錯誤。
超出語言標準,但實際上是必需的:如果使用一個文件,請將模塊放在使用它的主程序之前。否則,編譯器將不會意識到這一點。所以:
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

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