Deep array kopieren in Fortran
Brauche ich eine Tiefe Kopie eines (real) array Fortran (90), bin aber nicht sicher, genau, wie, eins zu bekommen, da ich nicht vollständig verstehen, wie Referenzen funktionieren. Intuitiv würde ich erwarten, dass dies von mir, was ich will:
do i=1,n
b(i) = a(i)
end do
Es wurde jedoch vor kurzem wies mich darauf hin, dass b(1:n) = a(1:n)
ist äquivalent zu dem code oben. Intuitiv würde ich erwarten, dass b(1:n) = a(1:n)
lediglich bewirkt, dass die Referenz von b(1:n)
auf die Stelle des a(1:n)
im Speicher.
Ist b(1:n) = a(1:n)
eine Tiefe Kopie? Warum? Was ist Los mit den zugrunde liegenden Referenzen im Gegensatz zu b = a
?
Du musst angemeldet sein, um einen Kommentar abzugeben.
Den drei Möglichkeiten, die Sie erwähnen, für das kopieren von arrays, die
do
Schleifeb(1:n) = a(1:n)
undb = a
, alle sind gleichwertig; Sie kopieren Sie den Inhalt des Arraysa
in das arrayb
.a
undb
sind einfach arrays, keine Lust Zeiger oder nichts und so gilt die Abtretunga = b
ist im Grunde das gleiche wie der mathematische Ausdruck. Es ist keine Magie mit Referenzen auf, die die Bedürfnisse der Nutzer zu kennen), das ist der Grund, warum Fortran ist eine ziemlich geradlinig, die Sprache zu lernen. Sie können Zeiger-arrays in Fortran, aber das ist eine ganz andere Frage.M Metcalf und J. Reid Fortran 90/95 explained ist immer eine gute Referenz für die Beratung auf Fortran-Sprache-Funktionen. Ab Seite 48:
Beachten Sie auch, dass ein Skalar-Ausdruck zugewiesen werden kann, um ein array, in welchem Fall die saclar Wert ist als broadcast an alle array-Elemente.
In Bezug auf wie ist das alles tatsächlich umgesetzt wird, das ist, was ich denke, Sie fahren mit Ihrer Frage, das ist völlig unspezifisch die Fortran-standard. Diese Art der Sache ist, unspezifiziert gelassen zu ermöglichen compiler-Autoren zu tun, was Optimierungen Sie Lust haben. Zum Beispiel in der Zuordnung
a = b
die Reihenfolge, in der die Elemente derb
sind, werden ina
ist nicht spezifiziert durch den standard, so dass verschiedene Compiler könnte dies auf unterschiedliche Weise. Alles, was Sie wissen müssen ist, dass für diese Frage ist, dass, soferna
undb
sind keine Zeiger, danna
undb
sind verschiedene arrays und dass der Wechsel eines Elements von einer nicht ändern, wird das entsprechende element des anderen. So ist es ein Gefühl,a=b
ist eine "Tiefe Kopie" und Sie können sich das wie das kopieren aller Elemente inb
den Speicherort dera
.b(1:n) = a(1:n)
undb = a
sind nicht gleichwertig. Das erstere wird nicht überprüft, für die notwendige Neuverteilung, zum Beispiel.a = b kopiert den gesamten array b in eine. Wenn Sie möchten, dass nur ein Teil des Arrays, die größer dimensioniert ist als n, dann können Sie subskript-notation a(1:n) = b(1:n). Das ist Fortran-90-es ist eine höhere Sprache als FORTRAN 77. Wir können sagen, dass "a = b" ist eine Kopie und nicht zuordnen Zeiger a mit Ziel b, weil diese Anweisung verwendet den operator "=". Zeiger-Verein nutzt =>.
Bearbeiten: "kopieren", es macht eine doppelte, mit wahrscheinlich den gleichen Maschinencode wie deine do-Schleife. Die Zeiger-Verein macht eine Referenz, ohne dabei die do-Schleife zu duplizieren, werden alle array-Elemente.
Sehen http://en.wikipedia.org/wiki/Fortran_95_language_features
a
auf die Lage desb
im Speicher, oder indem Sie eine Kopie aller Elemente inb
auf die Lage desa
im Speicher?=>
statt=
).gfortran
zum Beispiel implementiert array-Kopie entwedermemcpy
(bitweise Speicher zu kopieren, sehr schnell) oder verstecktDO
Schleifen, je nach Kontext.=
verwendet, für eine Referenz-Zuordnung.