在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
提交
取消