为了账号安全,请及时绑定邮箱和手机立即绑定

在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 关注
  • 1826 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信