我想计算Fortran 90中两个向量的叉积。例如,用词来说,(1,2,3)和(4,5)的叉积,6)在笛卡尔坐标系中是(-3,6,-3)。我写了下面的代码(主程序之后函数定义):计算Fortran 90中两个向量的叉积90
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 crosstest
FUNCTION 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)
1
Error: Rank mismatch in array reference at (1) (2/1)
,其中10号线是r=cross(m,n)
。看来我必须错误地指定尺寸。这里有一些想法,我有:
也许功能
cross
的主程序的声明应该是简单的整型变量,而不是一个1by3整数数组。所以我试着删除主程序中INTEGER, DIMENSION(3) :: cross
行中的, DIMENSION(3)
。但我收到一条错误消息:crosstest.f90:10.4: r=cross(m,n) 1 Error: The reference to function 'cross' at (1) either needs an explicit INTERFACE or the rank is incorrect
所以这可能更糟糕。
Web上的一些(但不是全部)Fortran函数示例在主程序中的函数声明后放置了一条
EXTERNAL
语句。所以我试图在主程序中的声明块后放置一行EXTERNAL cross
。我收到一条错误消息:crosstest.f90:8.16: EXTERNAL cross 1 Error: EXTERNAL attribute conflicts with DIMENSION attribute at (1)
所以这看起来也不正确。
Web上的一些(但不是全部)Fortran函数示例在函数定义的倒数第二行上放置了一条
RETURN
语句。我试过这个,但是我得到原来的排名不匹配错误:crosstest.f90:10.9: r=cross(m,n) 1 Error: Rank mismatch in array reference at (1) (2/1)
所以这不能解决问题。
你能帮我看看我的错误吗?
非常感谢您的时间! – Andrew
+ 1使用'[1,2,3]'代替(更丑陋)'(\ 1,2,3 \)'。 –