wie Wrapper für 'allocate' schreiben

8

Ich versuche, einen Wrapper für die "Zuweisungs" -Funktion zu schreiben, d. h. Funktion, die ein Array und Dimensionen empfängt, Speicher zuweist und zugeordnetes Array zurückgibt. Das Wichtigste ist, dass die Funktion mit Arrays unterschiedlichen Ranges arbeiten muss. Aber ich muss explizit den Rang des Arrays in der Funktionsschnittstelle angeben, und in diesem Fall kompiliert der Code nur, wenn ich Arrays bestimmten Rangs als Parameter übergebe. Zum Beispiel kompiliert dieser Code nicht:

%Vor%

Kompilierungsfehler:

%Vor%

Gibt es eine Möglichkeit, einen solchen Wrapper zu implementieren? ..

Danke!

    
robusta 13.02.2010, 11:03
quelle

2 Antworten

10

Dies kann über einen generischen Schnittstellenblock erfolgen. Sie müssen Prozeduren für jeden Rang erstellen, den Sie behandeln möchten, z. B. memory_1d, memory_2d, ... memory_4d. (Offensichtlich eine Menge Ausschneiden und Einfügen.) Dann schreiben Sie einen generischen Schnittstellenblock, der all diesen Prozeduren den alternativen Namensspeicher als generischen Prozedurnamen gibt. Wenn Sie Speicher aufrufen, unterscheidet der Compiler, welcher memory_Xd basierend auf dem Rang des Arguments aufgerufen werden soll. Das Gleiche gilt für Ihre Freem-Funktionen.

Dies ist, wie intrinsische Funktionen wie die Sünde lange funktioniert haben - Sie können die Sünde mit echten Argumenten verschiedener Vorhersagen oder mit einem komplexen Argument bezeichnen, und der Compiler findet heraus, welche tatsächliche Sündenfunktion aufgerufen werden muss. In wirklich altem FORTRAN mussten Sie verschiedene Namen für die verschiedenen sin Funktionen verwenden. Jetzt moderne Fortran können Sie das gleiche mit Ihren eigenen Routinen einrichten.

Bearbeiten: Hinzufügen eines Codebeispiels zum Demonstrieren der Methode & amp; Syntax:

%Vor%     
M. S. B. 13.02.2010, 19:52
quelle
1

subroutine memory(array, length) hat als ersten Dummy-Parameter 1-dimensionales Array ( real(8), allocatable, intent(out), dimension(:) :: array ).

Das Aufrufen dieses Unterprogramms aus Ihrem Hauptprogramm mit dem 3-dimensionalen Array foo ( real(8), allocatable, dimension(:,:,:) :: foo ) ist offensichtlich ein Fehler. Und das ist der Compiler eigentlich gesagt.

Wenn Sie solche Subroutinen wirklich benötigen, schreiben Sie für jedes Array unterschiedlicher Dimension ein Paar memory / freem Unterroutinen - ein Unterroutinenpaar für eindimensionales Array, ein anderes für zweidimensionales Array usw.

Übrigens, memory Unterroutinen werden im Allgemeinen anders sein, denn um ein n-dimensionales Array zuzuteilen, müssen Sie n Extents an die oben erwähnte Subroutine übergeben.

    
Wildcat 13.02.2010 11:29
quelle

Tags und Links