Saltar al contenido

Cálculo del producto vectorial de dos vectores en Fortran 90

Tenemos la mejor solución que descubrimos por todo internet. Deseamos que te sirva de ayuda y si deseas aportar cualquier detalle que nos pueda ayudar a crecer hazlo libremente.

Solución:

La mejor práctica es colocar sus procedimientos (subrutinas y funciones) en un módulo y luego “usar” ese módulo desde su programa principal u otros procedimientos. No necesita “usar” el módulo de otros procedimientos del mismo módulo. Esto hará que la interfaz del procedimiento sea explícita para que el programa o procedimiento que llama “conozca” las características de los argumentos… permite que el compilador verifique la consistencia entre los argumentos en ambos lados… el llamador y el destinatario… esto elimina muchos errores.

Fuera del estándar del lenguaje, pero necesario en la práctica: si usa un archivo, coloque el módulo antes del programa principal que lo usa. De lo contrario, el compilador no se dará cuenta. entonces:

module my_subs

implicit none

contains

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

end module my_subs


PROGRAM 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 (*, *) r

END PROGRAM crosstest

Esta es una respuesta tardía, pero como me topé con esto y aún no hay una explicación real de por qué ocurrió su error, pensé que agregaría una explicación para todos los demás que se topan con esta pregunta:

En su programa, usted define un array llamado crossque es de rango 1. Entonces llamas al cross función que defina más abajo. Desde el cross la función no tiene una interfaz explícita (consulte la respuesta de MSB), el compilador no lo sabe en este momento. Lo que sí sabe es el array declaraste. Si tú escribes r = cross(m, n)el compilador cree que desea acceder al elemento en la posición (m, n) del array cross. Desde esto array es de rango 1, pero proporcionó dos argumentos, obtiene el error

rank mismatch in array reference at (1) (2/1)

lo que significa que proporcionó dos coordenadas cuando el compilador esperaba una.

Acuérdate de que tienes la capacidad de comentar si te ayudó.

¡Haz clic para puntuar esta entrada!
(Votos: 0 Promedio: 0)



Utiliza Nuestro Buscador

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *