Chciałbym obliczyć krzyż iloczyn dwóch wektorów w Fortran 90. Na przykład słowami, iloczyn krzyżowy (1, 2, 3) i (4, 5 , 6) okazuje się być (-3, 6, -3) we współrzędnych kartezjańskich. Napisałem następujący kod (program główny następnie definicji funkcji):Obliczanie iloczynu krzyżowego dwóch wektorów w Fortranie 90
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
Ale otrzymuję komunikat o błędzie:
crosstest.f90:10.9:
r=cross(m,n)
1
Error: Rank mismatch in array reference at (1) (2/1)
gdzie linia 10 jest r=cross(m,n)
. Wydaje się, że muszę niepoprawnie określić wymiar. Oto kilka pomysłów mam:
Być deklaracja funkcji
cross
w programie głównym powinien być po prostu zmienną całkowitą, a nie tablica 1by3 całkowitą. Tak więc próbowałem usunąć, DIMENSION(3)
w liniiINTEGER, DIMENSION(3) :: cross
w programie głównym. Ale pojawia się komunikat o błędzie: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
to prawdopodobnie jeszcze gorsze.
Niektóre (ale nie wszystkie) przykłady funkcji Fortran na stronie internetowej oświadczenie
EXTERNAL
po deklaracji funkcji w programie głównym. Próbowałem więc umieścić wierszEXTERNAL cross
po bloku deklaracji w programie głównym. Pojawia się komunikat o błędzie:crosstest.f90:8.16: EXTERNAL cross 1 Error: EXTERNAL attribute conflicts with DIMENSION attribute at (1)
To również wydaje się nieprawidłowe.
Niektóre (ale nie wszystkie) przykłady funkcji fortuna na stronie internetowej oświadczenie
RETURN
od drugiej do ostatniej linii definicji funkcji. Próbowałem tego, ale dostaję oryginalny błąd niedopasowania rang:crosstest.f90:10.9: r=cross(m,n) 1 Error: Rank mismatch in array reference at (1) (2/1)
To nie rozwiązuje problemu.
Czy możesz mi pomóc zobaczyć mój błąd?
Wielkie dzięki za poświęcony czas! – Andrew
+1 za użycie '[1, 2, 3]' zamiast (im bardziej brzydki) '(\ 1, 2, 3 \)'. –