2010-11-01 5 views
9

Desidero inizializzare un array su una riga con un ciclo di loop implicito . Tuttavia, ottengo sempre un errore di sintassi o di forma. Qualcuno può aiutarmi a correggere il seguente costrutto?Inizializzazione implicita del ciclo di loop

integer myarray :: (maxdim, nr) 

myarray(1:maxdim,nr) = (/ (/i,i=1,maxdim/),nr /) 

risposta

16

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 
+7

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

6

Il ciclo di azioni implicito creerà solo un vettore, quindi è necessario ridisegnarlo. Qualcosa di simile a questo:

integer, dimension(m,n) :: myarray 
integer :: ix, jx 
... 
myarray = reshape([ (ix, ix = 1, m*n) ], [ m, n ]) 

o forse si desidera una più complicata, annidato, implicita-do ciclo:

myarray = reshape([ ((ix+jx, ix = 1, m), jx = 1, n) ], [ m, n ]) 

nota che sto utilizzando la convenzione Fortran2003 di [ ] per delimitare le costruzioni matrice, piuttosto di (/ /). Si noti inoltre che è necessario dichiarare le variabili dell'indice ciclo continuo implicite.