Está inicializando una matriz con MAXDIM
filas y NR
columnas, y parece que cada columna contiene los números enteros 1 a MAXDIM
.
Como primer paso, seguir adelante y escribir a cabo el actual DO
-loop:
do j=1,NR
do i=1,MAXDIM
myarray(i,j) = i
end do
end do
colapsar el bucle interno a una estructura de bucle implícito:
do j = 1,NR
myarray(1:MAXDIM,j) = (/ (i, i=1,MAXDIM) /)
end do
Cuando tratamos de contraer la bucle externo, sin embargo, sucede algo extraño:
myarray = (/ ((/ (i, i=1,MAXDIM) /), j=1,NR) /)
Ahora, obtengo un inc ompatible clasifica el error como lo hizo. Como yo no soy muy bueno en los implícitos do-bucles o bien, miré a los resultados intrínsecos shape
para el constructor de matrices:
print *, shape(myarray)
print *, shape((/ ((/ (i, i=1,MAXDIM) /), j=1,NR) /))
Esto muestra
5 10
50
El constructor de matrices es simplemente expandiendo una matriz 1-D, aplanando cualquier construcción de matriz anidada. De hecho, podemos soltar el segundo conjunto de (/ /)
para simplificar. Como todo está ya en el orden correcto, podemos usar el reshape
intrínseco para garantizar el rango correcto. Mi programa de pruebas completo es entonces:
program sotest
implicit none
integer, parameter :: MAXDIM = 5
integer, parameter :: NR = 10
integer :: i
integer :: j
integer :: myarray(MAXDIM, NR)
integer :: myarray_implicit(MAXDIM, NR)
do j = 1,NR
do i = 1,MAXDIM
myarray(i,j) = i
end do
end do
myarray_implicit = reshape((/ ((i,i=1,MAXDIM), j=1,NR) /), (/ MAXDIM, NR /))
print *, all(myarray == myarray_implicit)
end program sotest
Tenga en cuenta que también es válido para escribir 'myarray_implicit = cambio de forma ((/ ((i, i = 1, MAXDIM), j = 1, NR) /), shape (myarray_implicit)) ' para evitar volver a escribir explícitamente las dimensiones de su matriz. – Markus