亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

在Fortran 90中計算兩個向量的叉積

在Fortran 90中計算兩個向量的叉積

Cats萌萌 2019-09-26 14:45:32
在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


查看完整回答
反對 回復 2019-09-26
?
慕桂英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)

這意味著當編譯器期望一個坐標時,您提供了兩個坐標。


查看完整回答
反對 回復 2019-09-26
  • 2 回答
  • 0 關注
  • 1919 瀏覽

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號