Wie kann die Array-Größe in Fortran während des Betriebs erhöht werden?

9

Mein Programm läuft durch ein 3D-Array, markiert "Cluster", die es findet, und führt dann einige Überprüfungen durch, um zu sehen, ob benachbarte Cluster eine Markierung über dem aktuellen Cluster haben. Es gibt ein zweites Array, das das "richtige" Cluster-Label enthält. Wenn festgestellt wird, dass der n. Angrenzende Cluster korrekt beschriftet ist, wird diesem Element 0 zugewiesen, andernfalls wird es dem richtigen Label zugewiesen (wenn beispielsweise die n-te Site Label 2 hat und ein Nachbar mit 3, das dritte Element des labelArray ist auf 2 gesetzt. Ich habe einen guten Grund, das zu tun, ehrlich!

Ich möchte nur das n-te Element von labelArray on the fly zuweisen. Ich habe zuweisbare Arrays betrachtet und Dinge als labelArray(*) deklariert, aber ich verstehe diese nicht wirklich, obwohl ich das Internet und StackOverflow durchsucht habe.

Also jede Hilfe dabei wäre großartig.

    
Pureferret 05.12.2011, 11:11
quelle

3 Antworten

9

Hier ist eine Stack Overflow-Frage mit einigen Codebeispielen, die verschiedene Möglichkeiten zur Verwendung von Fortran-zuweisbaren Arrays zeigen: Wie man ein zuvor unbekanntes Array als Ausgabe einer Funktion in Fortran erhält : Deklarieren, Zuweisen, Testen, um bereits zugewiesen zu werden, Verwenden von der neue move_alloc und die Zuweisung bei der Zuweisung. Nicht gezeigt, es gibt explizite Freigabe, da die Beispiele move_alloc und automatische Freigabe beim Beenden einer Prozedur verwenden.

P.S. Wenn Sie wiederholt ein Element hinzufügen möchten, sollten Sie über Ihren Datenstrukturansatz nachdenken. Das Hinzufügen eines Elements zu einer Zeit durch das Erweitern eines Arrays ist kein effizienter Ansatz. Um ein Array von N Elementen zu N + 1 in Fortran wachsen zu lassen, wird wahrscheinlich ein neues Array erstellt und alle vorhandenen Elemente kopiert. Eine geeignetere Datenstruktur könnte eine verknüpfte Liste sein. Sie können eine verknüpfte Liste in Fortran erstellen, indem Sie einen benutzerdefinierten Typ erstellen und Zeiger verwenden. Sie verketten die Mitglieder zusammen und zeigen von einem zum nächsten. Der Aufwand für das Hinzufügen eines anderen Mitglieds ist gering. Der Nachteil ist, dass es am einfachsten ist, auf die Mitglieder der Liste in der Reihenfolge zuzugreifen. Sie haben nicht die einfache Fähigkeit eines Arrays, Indizes zu verwenden, um auf die Mitglieder in beliebiger Reihenfolge zuzugreifen.

Info über verlinkte Listen in Fortran, die ich im Internet gefunden habe: Ссылка und Ссылка

    
M. S. B. 05.12.2011, 11:50
quelle
4

Wenn Sie ein Array zuweisbar deklarieren, verwenden Sie die deaktivierte Form in der Form real,

allocatable :: labelArray(:,:)

oder

real,dimension(:,:),allocatable :: labelArray

mit der Anzahl doppelter Doppelpunkte, die Rang (Anzahl Ihrer Indizes) Ihres Arrays bedeuten.

Wenn das Array nicht zugewiesen ist, verwenden Sie

%Vor%

mit der korrekten Anzahl von Indizes. Zum Beispiel allocate(labelarray(2:3,-1:5)) für Array mit den Indizes 2 bis 3 in Dimension 1 und -1 bis 5 in Dimension 2.

Um die Dimension zu ändern, müssen Sie zuerst das Array mit

freigeben %Vor%

Um ein zugewiesenes Array einer neuen Form zuzuordnen, müssen Sie zunächst ein neues Array mit der neuen Form zuweisen, das vorhandene Array in das neue Array kopieren und den Verweis des alten Arrays mithilfe von move_alloc() auf das neue Array verschieben.

%Vor%

Das alte Array wird automatisch freigegeben, wenn die neue Array-Referenz um move_alloc() verschoben wird.

Fortran 95 hebt die Zuweisung von Arrays automatisch auf, wenn sie außerhalb des Gültigkeitsbereichs liegen (z. B. das Ende ihrer Subroutine).

Fortran 2008 hat eine schöne Eigenschaft der automatischen Zuweisung bei der Zuweisung. Wenn Sie array1=array2 sagen und Array1 nicht zugewiesen ist, wird es automatisch zugewiesen, um die richtige Form zu haben.

    
Vladimir F 05.12.2011 11:46
quelle
1

Späterer Kommentar ... überprüfe Numerische Rezepte für Fortran 90. Sie implementierten eine nette Reallocate-Funktion, die Fortran 90-konform war. Ihren Arrays muss in diesem Fall ein Zeiger zugewiesen sein, der nicht zuweisbar ist.

Die Funktion empfängt das alte Array und die gewünschte Größe und gibt einen Zeiger auf das neue Array in der Größe zurück.

Wenn möglich, verwenden Sie Fortran 95 oder 2003. Wenn 2003 unmöglich ist, dann ist 95 ein guter Kompromiss. Es bietet eine bessere Pointer-Syntax.

    
Alvaro Fernandez 11.06.2014 13:45
quelle