Tiefe Array-Kopie in Fortran

7

Ich brauche eine tiefe Kopie eines (echten) Arrays in Fortran (90), bin mir aber nicht sicher, wie ich genau eins bekommen soll, da ich nicht ganz verstehe, wie Referenzen funktionieren. Intuitiv würde ich damit rechnen, dass mir das gelingt, was ich will:

%Vor%

Allerdings wurde kürzlich darauf hingewiesen, dass b(1:n) = a(1:n) dem obigen Code entspricht. Intuitiv würde ich erwarten, dass b(1:n) = a(1:n) lediglich dazu führt, dass der Verweis von b(1:n) auf den Speicherort von a(1:n) im Speicher zeigt.

Ist b(1:n) = a(1:n) eine tiefe Kopie? Warum? Was passiert mit den zugrunde liegenden Referenzen im Gegensatz zu b = a ?

    
astay13 03.08.2012, 16:40
quelle

2 Antworten

13

Die drei Arten, die Sie zum Kopieren von Arrays angeben, die do -Schleife, b(1:n) = a(1:n) und b = a , sind alle gleichwertig; Sie kopieren den Inhalt des Arrays a in das Array b . a und b sind einfach Arrays, keine Fancy Pointer oder irgendetwas und so ist die Zuweisung a = b im Grunde die gleiche wie der mathematische Ausdruck. Es gibt keine Magie mit Referenzen (die der Benutzer wissen muss), weshalb Fortran eine ziemlich einfache Sprache zu lernen ist. Sie können Zeiger-Arrays in Fortran haben, aber das ist ein ganz anderes Problem.

M Metcalf und J Reids Fortran 90/95 erklärt ist immer eine gute Referenz für die Beratung von Fortran Sprachfunktionen. Ab Seite 48:

  

3.11 Array-Zuweisung

     

Durch eine immanente Zuweisung kann ein Array-Ausdruck einer Array-Variablen derselben Form zugewiesen werden, die so interpretiert wird, als ob jedes Element des Ausdrucks dem entsprechenden Element der Variablen zugewiesen wäre. Zum Beispiel mit den Deklarationen

%Vor%      

Die Aufgabe

%Vor%      

ersetzt a(i,j) by a(i,j) + 1.0 für i=1,2..,10 und j=1,2,..,20 .

Beachten Sie auch, dass einem Array ein skalarer Ausdruck zugewiesen werden kann. In diesem Fall wird der saclar-Wert an alle Array-Elemente gesendet .

In Bezug darauf, wie dies alles tatsächlich umgesetzt wird, was ich denke, dass Sie mit Ihrer Frage fahren, ist dies durch den Fortran-Standard völlig unspezifiziert. 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 wird beispielsweise die Reihenfolge, in der die Elemente von b in a kopiert werden, vom Standard nicht angegeben, sodass unterschiedliche Compiler dies auf unterschiedliche Weise tun können. Alles was Sie wissen müssen ist, dass für diese Frage, dass a und b keine Zeiger sind, dann a und b unterschiedliche Arrays sind und dass das Ändern eines Elements von eins das entsprechende Element nicht ändert von dem anderen. Es ist also ein Sinn, a=b ist eine "tiefe Kopie" und man kann sich vorstellen, alle Objekte in b in den Speicherort von a zu kopieren.

    
Chris 03.08.2012, 16:56
quelle
6

a = b kopiert das gesamte Array b in a. Wenn Sie nur einen Teil des Arrays haben möchten, der größer als n ist, können Sie die Indexnotation a (1: n) = b (1: n) verwenden. Das ist Fortran 90 - es ist eine höhere Sprache als FORTRAN 77. Wir können sagen, dass "a = b" eine Kopie ist und keinen Zeiger a mit Ziel b assoziiert, weil diese Anweisung den Operator "=" verwendet. Die Zeigerverknüpfung verwendet = & gt;.

Bearbeiten: Durch Kopieren wird ein Duplikat mit dem gleichen Maschinencode wie Ihre Do-Schleife erstellt. Die Zeigerassoziation erstellt eine Referenz, ohne die do-Schleife auszuführen, um alle Arrayelemente zu duplizieren.

Siehe Ссылка

    
M. S. B. 03.08.2012 16:55
quelle

Tags und Links