我想在 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 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
主程序中函数的声明应该只是一个整数变量,而不是一个 1×3 整数数组。所以我尝试在主程序中删除该行, DIMENSION(3)
。INTEGER, DIMENSION(3) :: cross
但我收到一条错误消息: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)
所以这并不能解决问题。
你能帮我看看我的错误吗?