Fortran 90で2つのベクトルの外積を計算したいと思います。たとえば、(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
は、関数定義の最後から2番目の行にステートメントが配置されています。これを試しましたが、元のランクの不一致エラーが発生します。crosstest.f90:10.9: r=cross(m,n) 1 Error: Rank mismatch in array reference at (1) (2/1)
したがって、これで問題が解決するわけではありません。
私のエラーを確認するのを手伝ってくれませんか。