real d(20)declara a d como un arreglo del tipo real con 20 elementos. Esto es, d consiste de 20 números del tipo real almacenados en forma contigua en memoria. Por convención, los arreglos en Fortran estan indexados a partir del valor 1. Por lo tanto el primer elemento en el arreglo es d(1) y el último es d(20). Sin embargo, se puede definir un rango de índice arbitrario para los arreglos como se observa en los siguientes ejemplos:
real b(0:19), c(-162:237)En el caso de b es similar con el arreglo d del ejemplo previo, excepto que el índice corre desde el 0 hasta el 19. El arreglo c es un arreglo de longitud 237-(-162)+1 = 400.
El tipo de los elementos de un arreglo puede ser cualquiera de los tipos básicos de datos ya vistos. Ejemplos:
integer i(10) logical aa(0:1) double precision x(100)
Cada elemento de un arreglo puede ser visto como una variable separada. Se referencia al i-ésimo elemento de un arreglo a por a(i). A continuación se muestra un segmento de código que guarda los primeros 10 cuadrados en un arreglo cuad
integer i, cuad(10) do i=1, 10, 1 cuad(i) = i**2; write(*,*) cuad(i) enddo
Un error común en Fortran es hacer que el programa intente accesar elementos del arreglo que estan fuera de los límites. Lo anterior es responsabilidad del programador, ya que tales errores no son detectados por el compilador.
real A(3,5)define un arreglo bidimensional de 3 x 5 = 15 números del tipo real. Es útil pensar que el primer índice es el índice del renglón, y el segundo índice corresponde a la columna. Por lo tanto se vería como:
1 | 2 | 3 | 4 | 5 | |
1 | |||||
2 | |||||
3 |
Un arreglo bidimensional podría también tener índices de rango arbitrario. La sintaxis general para declarar el arreglo es:
nombre (índice1_inf : indice1_sup, índice2_inf : indice2_sup)El tamaño total del arreglo es de
tamaño = (indice1_sup - indice1_inf + 1) x (indice2_sup - indice2_inf + 1)
Es muy común en Fortran declarar arreglos que son más grandes que la matriz que se va a guardar. Lo anterior es porque Fortran no tiene almacenamiento dinámico de memoria como el lenguaje C. Por ejemplo:
real A(3,5) integer i,j c c Solamente se usará una submatriz de 3 x 3 del arreglo c do i=1, 3 do j=1, 3 a(i,j) = real(i)/real(j) enddo enddoLos elementos en la submatriz A(1:3,4:5) no estan definidas. No se debe considerar que estos elementos estan inicializados a cero por el compilador (algunos compiladores lo hacen, pero otros no).
Considerando otra vez el ejemplo donde solamente se usa la submatriz de 3 x 3 del arreglo de 3 x 5. Los primeros 9 elementos que interesan se encuentran en las primeras nueve localidades de memoria, mientras que las últimas seis celdas no son usadas. Lo anterior funciona en forma transparente porque la dimensión principal es la misma para ambos, el arreglo y la matriz que se guarda en el arreglo. Sin embargo, frecuentemente la dimensión principal del arreglo será más grande que la primera dimensión de la matriz. Entonces la matriz noserá guardada en forma contigua en memoria, aún si la arreglo es contiguo. Por ejemplo, supongamos que la declaración hubiera sido A(5,3) entonces hubiera habido dos celdas "sin usar" entre el fin de la primera columna y el principio de la siguiente columna (suponiendo que asumimos que la submatriz es de 3 x 3).
Esto podría parecer complicado, pero actualmente es muy simple cuando se empieza a usar. Si se tiene en duda, puede ser útil hallar la dirección de un elemento del arreglo. Cada arreglo tendrá una dirección en la memoria asignada a partir del arreglo, que es el elemento (1,1). La dirección del elemento (i,j) esta dada por la siguiente expresión:
dirección[A(i,j)] = dirección[A(1,1)] + (j-1)*princ + (i-1)donde princ es la dimensión principal (la columna) de A. Observar que princ es en general diferente de la dimensión actual de la matriz. Muchos errores de lógica en Fortran son causados por lo anterior, por lo tanto es importante entender la diferencia.
real A, x dimension x(50) dimension A(10,20)son equivalentes a
real A(10,20), x(50)La sentencia dimensión es considerada actualmente como una forma en desuso.
integer nmax parameter (nmax=40) real A(nmax, nmax)Declarar apropiadamente los vectores x e y e inicializar