que programacion length elementos ejemplo contar array arrays fortran fortran90

programacion - Arrays de tamaño supuestos: Colón contra asterisco-DIMENSIÓN(:) arr vs. arr(*)



length javascript array (2)

La forma

real, dimension(:) :: arr

declara una matriz de assumed-shape , mientras que la forma

real :: arr(*)

declara una matriz de assumed-size .

Y, sí, hay diferencias entre su uso. Las diferencias surgen porque, aproximadamente, el compilador "conoce" la forma de la matriz de formas asumidas pero no de la matriz de tamaños asumidos. La información adicional disponible para el compilador significa que, entre otras cosas, las matrices de formas asumidas se pueden usar en expresiones de matriz completa. Una matriz de tamaño asumido solo se puede usar en expresiones de matriz completa cuando es un argumento real en una referencia de procedimiento que no requiere la forma de la matriz. Ah, y también en una llamada al lbound intrínseco, pero no en una llamada al lugar intrínseco. Hay otras diferencias sutiles, y no tan sutiles, que revelará su lectura atenta del estándar o de un buen libro de Fortran.

Algunos consejos para los nuevos programadores de Fortran es usar arreglos de formas asumidas cuando sea posible. No estaban disponibles antes de Fortran 90, por lo que verá muchos arreglos de tamaño asumido en el código anterior. Las matrices de formas asumidas son mejores en el código nuevo, porque las funciones SHAPE y SIZE se pueden usar para consultar sus tamaños para evitar errores fuera de límites y para ASIGNAR matrices cuyas dimensiones dependen de las dimensiones de las matrices de entrada.

¿Hay alguna diferencia entre estos dos métodos para declarar una matriz de tamaño asumido?

p.ej

real, dimension(:) :: arr

y

real :: arr(*)


La respuesta de High Performance Mark explica la diferencia entre las dos afirmaciones, en resumen: sí, hay una diferencia; solo uno declara una matriz de tamaño asumido, y las implicaciones.

Sin embargo, como dimension(:) pero se menciona, aparentemente en contra de la dimension(*) , añadiré una cosa.

real, dimension(:) :: arr1 real, dimension(*) :: arr2

es equivalente a

real :: arr1(:) real :: arr2(*)

o incluso usando declaraciones de dimension . [No quiero alentar eso, así que no escribiré el ejemplo.]

La diferencia importante en la pregunta es el uso de * y : no dimension .

Tal vez hubo alguna combinación de tamaño asumido con argumento ficticio . Es como un argumento ficticio donde esta elección es más común.