Я хотел бы вычислить перекрестное произведение двух векторов в 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 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 = крест (м, п)
1
Ошибка: ссылка на функцию «крест» в (1) требует либо
явный ИНТЕРФЕЙС или ранг неверный
, так что, вероятно, это еще хуже.
Некоторые (но не все) примеры функций Fortran в Интернете помещают оператор EXTERNAL
после объявления функции в основной программе. Поэтому я попытался разместить строку ВНЕШНИЙ крест
после блока объявления в основной программе. Я получаю сообщение об ошибке:
crosstest.f90: 8.16:
ВНЕШНИЙ крест
1
Ошибка: атрибут EXTERNAL конфликтует с атрибутом DIMENSION в (1)
Так что это тоже кажется неверным.
Некоторые (но не все)Примеры функций Fortran в Интернете помещают оператор RETURN
во предпоследнюю строку определения функции. Я пробовал это, но получаю исходную ошибку несоответствия рангов:
crosstest.f90: 10.9:
r = крест (м, п)
1
Ошибка: несоответствие ранга в ссылке на массив в (1) (2/1)
Так что это не решает проблему.
Не могли бы вы помочь мне увидеть мою ошибку?