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 cross
que 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ó.