2016-06-20 10 views
2

Ist das Präsenz-Attribut auf Komponenten abgeleiteter Datenstrukturen "geerbt"? Der Standard sagt, ein Dummy-Argument ist nicht vorhanden, wenn das entsprechende tatsächliche Argument nicht vorhanden ist. Aber ich bin nicht sicher, wie dies zu Komponenten von abgeleiteten Datentypen gilt, wie im folgende Beispiel:Vorhandensein optionaler abgeleiteter Datentyp-Komponenten

program test 
    implicit none 

    type some_type 
    integer :: acomponent 
    end type some_type 

    type(some_type) :: testval 

    testval%acomponent = 42 

    call outer() 

    call outer(testval) 

contains 

    subroutine outer(me) 
    type(some_type), optional :: me 

    call inner(me%acomponent) 
    end subroutine outer 

    subroutine inner(simple) 
    integer, optional :: simple 

    if (present(simple)) then 
     write(*,*) 'simple present:', simple 
    else 
     write(*,*) 'simple not present...' 
    end if 
    end subroutine inner 

end program test 

Das obige Beispiel kompiliert und läuft gut mit gfortran-5, aber ist es Standard konforme? Irgendwie kann ich es nicht herausfinden, indem ich auf den Standard schaue.

+0

Da Sie gfortran verwenden, können Sie nicht standardmäßige Fortran mit dem Compiler-Flag '-std = f2008ts' deaktivieren. Dies ermöglicht den Fortran-Standard 2008 einschließlich der Ergänzungen der Technischen Spezifikation (TS) 29113 zur weiteren Interoperabilität von Fortran mit C und TS 18508 zu zusätzlichen parallelen Merkmalen in Fortran. – jlokimlin

+0

@jlokimlin danke. Allerdings kompiliert der Code auch mit diesem Flag, zumindest mit der Installation von gfortran 5.4, die ich hier habe. Ich verwende tatsächlich -std = f2008 im ursprünglichen Code, obwohl ich zugeben muss, dass ich diesen kleinen Beispielcode mit der Markierung bis jetzt nicht überprüft habe. – haraldkl

Antwort

3

Der Beispielcode stimmt nicht überein. Der relevante Teil des Fortran 2008-Standards ist in 12.5.2.12p3 (5) - "Ein Bezeichner mit [ein optionales Dummy-Argument, das nicht vorhanden ist] als das Basisobjekt und mit einem oder mehreren Unterobjekterkennungselementen nicht" () als ein tatsächliches Argument geliefert werden. "

Die Komponentenreferenz in me%acomponent ist ein Subobjektselektor. Wenn me ein Array ist, wäre ein Array-Index eines beliebigen Formulars ebenfalls ein Subobjekt-Selektor.

+0

Vielen Dank. Irgendwie hatte ich den Eindruck, es sollte nicht erlaubt sein, aber ging verloren, wenn ich in den Standard schaute. – haraldkl