Fortran 90で2つのベクトルの外積を計算したいとします。たとえば、(1,2,3)と(4,5 、6)はデカルト座標で(-3,6、-3)となる。Fortran 90で2つのベクトルの外積を計算する
crosstest.f90:10.9:
r=cross(m,n)
1
Error: Rank mismatch in array reference at (1) (2/1)
ライン10はr=cross(m,n)
です:私は、エラーメッセージを取得し、
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
しかし:私は、次のコード(関数の定義に続いて、メインプログラム)を書きました。間違って次元を指定する必要があるようです。ここで私が持っているいくつかのアイデアです:
おそらく、メインプログラム内の関数
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
これはさらに悪いです。
ウェブ上の一部のFortran関数の例(
EXTERNAL
)は、メインプログラムの関数宣言の後に記述します。そこで私は、メインプログラムの宣言ブロックの後に行EXTERNAL cross
を置こうとしました。crosstest.f90:8.16: EXTERNAL cross 1 Error: EXTERNAL attribute conflicts with DIMENSION attribute at (1)
これは間違っているようです。
Web上の一部のFortran関数の例には、関数定義の最後から2番目の行に
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]'を使うために+1してください。 –