I tre modi di cui parli per le matrici la copia, il ciclo do
, b(1:n) = a(1:n)
e b = a
, sono tutti equivalenti; copiano il contenuto dell'array a
nell'array b
. a
e b
sono semplicemente matrici, non puntatori di fantasia o altro e quindi l'assegnazione a = b
è fondamentalmente la stessa dell'espressione matematica. Non c'è magia con i riferimenti in corso (che l'utente deve sapere), motivo per cui Fortran è un linguaggio piuttosto semplice da imparare. Puoi avere array di puntatori in Fortran, ma questo è un altro problema.
M Metcalf e J Reid's Fortran 90/95 ha spiegato è sempre un buon riferimento per la consultazione sulle funzionalità del linguaggio Fortran. Da pagina 48:
3,11 assegnazione Array
Con assegnazione intrinseca, un'espressione matrice può essere assegnato ad una variabile array della stessa forma, che viene interpretata come se sono stati assegnati ciascun elemento dell'espressione all'elemento corrispondente della variabile. Ad esempio, con le dichiarazioni
real, dimension(10, 20) :: a
L'assegnazione
a = a + 1.0
sostituisce a(i,j)
da a(i,j) + 1.0
per i=1,2..,10
e j=1,2,..,20
.
noti inoltre che un'espressione scalare può essere assegnato ad una matrice, nel qual caso il valore saclar viene trasmesso a tutti gli elementi dell'array.
In termini di come tutto questo è effettivamente implementato, che è quello che penso tu stia guidando con la tua domanda, questo è completamente non specificato dallo standard Fortran. Questo genere di cose non viene specificato per consentire agli autori di compilatori di fare qualsiasi ottimizzazione si sentano. Ad esempio, nell'assegnazione a = b
, l'ordine in cui gli elementi di b
vengono copiati in a
non è specificato dallo standard, pertanto compilatori diversi potrebbero farlo in modi diversi. Tutto quello che devi sapere è che questa domanda è che, fornito a
e non sono puntatori, quindi a
e sono array distinti e che la modifica di un elemento di uno non modifica l'elemento corrispondente dell'altro. Quindi, in un certo senso, a=b
è una "copia profonda" e puoi pensare a ciò copiando tutti gli elementi in b
nella posizione di memoria di a
.
@IanH Questo non è qualcosa di cui so molto, quindi mi sono concentrato sugli array nella mia risposta. Sarebbe interessante vedere un esempio di ciò che non è il caso dei tipi derivati se si desidera pubblicare una risposta. – Chris
Ci scusiamo per questo balbettio, è stata una bolla di pensiero incompiuta che ho deciso non pertinente alla domanda (dato che il manifesto menziona specificamente variabili REALI). Non ero nemmeno consapevole del fatto che fosse stato pubblicato. – IanH
'b (1: n) = a (1: n)' e 'b = a' non sono equivalenti. Il primo non controllerà la necessaria riallocazione, per esempio. –