Die drei Möglichkeiten, wie Sie für das Kopieren von Arrays erwähnen, die do
Schleife, b(1:n) = a(1:n)
und b = a
, sind alle gleichwertig sind; Sie kopieren den Inhalt des Arrays a
in das Array b
. a
und b
sind einfach Arrays, keine Phantasie-Zeiger oder irgendetwas und so ist die Zuordnung a = b
im Grunde das gleiche wie der mathematische Ausdruck. Es gibt keine Magie mit Referenzen (die der Benutzer wissen muss), weshalb Fortran eine ziemlich direkte Sprache zu lernen ist. Sie können Zeiger-Arrays in Fortran haben, aber das ist ein ganz anderes Problem.
M Metcalf und J Reid Fortran 90/95 erklärt ist immer eine gute Referenz für die Beratung auf Fortran Sprachfunktionen. Von Seite 48:
3,11 Array Zuordnung
durch intrinsische Zuordnung kann ein Array-Expression kann auf eine Feldvariable der gleichen Form zugeordnet werden, die als ob jedes Element der Expressions interpretiert wurden zugewiesen zu dem entsprechenden Element der Variablen. Zum Beispiel mit den Erklärungen
real, dimension(10, 20) :: a
Die Zuordnung
a = a + 1.0
a(i,j)
von a(i,j) + 1.0
für i=1,2..,10
und j=1,2,..,20
ersetzt.
Beachten Sie auch, dass ein Skalar Ausdruck zu einem Array zugeordnet werden kann, in welchem Fall der Wert saclar all Array-Elemente ausgestrahlt wird.
In Bezug darauf, wie dies alles tatsächlich implementiert ist, was ist, was ich denke, Sie fahren mit Ihrer Frage, das ist völlig durch den Fortran-Standard nicht spezifiziert. Diese Art von Sache ist nicht spezifiziert, damit Compiler-Autoren tun können, was auch immer sie für Optimierungen wollen. In der Zuweisung a = b
ist die Reihenfolge, in der die Elemente b
in a
kopiert werden, vom Standard nicht spezifiziert, so dass unterschiedliche Compiler dies auf verschiedene Arten tun können. Alles, was Sie wissen müssen, ist, dass für diese Frage, a
und b
keine Zeiger sind, dann sind a
und b
unterschiedliche Arrays und das Ändern eines Elements von einem ändert nicht das entsprechende Element des anderen. Es ist also ein Sinn, a=b
ist eine "tiefe Kopie" und Sie können sich das vorstellen, als ob Sie alle Elemente in b
an den Speicherort von a
kopieren würden.
@IanH Das ist nicht etwas, über das ich so viel weiß, also konzentrierte ich mich nur auf Arrays in meiner Antwort. Es wäre interessant zu sehen, dass ein Beispiel für abgeleitete Typen nicht der Fall ist, wenn Sie eine Antwort posten möchten. – Chris
Entschuldigung für dieses Geschwätz, es war eine unvollendete Gedankenblase, die ich für die Frage irrelevant fand (da das Poster speziell REAL-Variablen erwähnt). Mir war nicht einmal bewusst, dass es gepostet wurde. – IanH
'b (1: n) = a (1: n)' und 'b = a' sind nicht äquivalent. Erstere prüft beispielsweise nicht auf eine notwendige Umverteilung. –