Si sta inizializzando un array con le righe MAXDIM
e le colonne NR
e sembra che ogni colonna contenga i numeri interi da 1 a MAXDIM
.
Come primo passo, andare avanti e scrivere l'attuale DO
-loop:
do j=1,NR
do i=1,MAXDIM
myarray(i,j) = i
end do
end do
comprimere il ciclo interno di una struttura ad anello implicita:
do j = 1,NR
myarray(1:MAXDIM,j) = (/ (i, i=1,MAXDIM) /)
end do
Quando proviamo a comprimere la anello esterno, però, succede qualcosa di strano:
myarray = (/ ((/ (i, i=1,MAXDIM) /), j=1,NR) /)
Ora, ricevo un aumento ompatible ranghi errore come hai fatto tu. Dal momento che non sono molto bravo a impliciti fai-loop sia, ho guardato i risultati shape
intrinseche per la costruzione Array:
print *, shape(myarray)
print *, shape((/ ((/ (i, i=1,MAXDIM) /), j=1,NR) /))
Questo stampa
5 10
50
Il costruttore matrice è semplicemente espandendo un array 1-D, che appiattisce tutte le costruzioni di array annidati. Possiamo effettivamente eliminare il secondo set di (/ /)
per semplificare. Poiché tutto è già nell'ordine corretto, possiamo utilizzare l'intrinseco reshape
per garantire il posizionamento corretto. Il mio programma di test completo è quindi:
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
Nota che è valida anche scrivere 'myarray_implicit = reshape ((/ ((i, i = 1, MAXDIM), j = 1, NR) /), shape (myarray_implicit)) ' per evitare di digitare esplicitamente di nuovo le dimensioni della matrice. – Markus