2016-05-09 6 views

Antwort

4

Ja, das ist in Fortran verboten. Dies ist im Fortran 2008 Standard, Cl definiert. 2.3.2 "Statement order":

enter image description here

1 Die Syntaxregeln von Ziffer 2.1 geben Sie die Anweisung Bestellung innerhalb von Programmeinheiten und Unterprogramme. Diese Regeln sind in Tabelle 2.1 dargestellt [...]. Tabelle 2.1 zeigt die Ordnungsregeln für Anweisungen und gilt für alle Programmeinheiten, Unterprogramme und Schnittstellenkörper. Vertikale Linien zeichnen Abarten von Aussagen, die möglicherweise durchsetzt sind, und horizontale Linien beschreiben Varianten von Aussagen, die nicht eingestreut sein dürfen. [...] Zwischen bedienen und enthält Anweisungen in einem Unterprogramm, nicht ausführbare Anweisungen voraus allgemein ausführbaren Anweisungen [...]

(Hervorhebung von mir)


[Leicht off-topic , aber im Zusammenhang] Bitte beachten Sie, dass während

integer :: a 
integer :: b = 0 
integer :: c 

erlaubt ist, dies den Nebeneffekt hat, dass b diebekommtAttribut. Das ist normalerweise nicht das, was Sie wollen ...

2

Die Fehlermeldung ist ziemlich klar. Fortran-Programme und Unterprogramme sind in zwei Teile unterteilt. Zuerst der Spezifikationsteil, wo Sie Module verwenden, Variablen definieren, abgeleitete Typen, Schnittstellen ... Und dann den ausführbaren Teil, wo Sie die eigentlichen ausführbaren Anweisungen oder Kontrollstrukturen ablegen.

Es ist nicht möglich, sie zu mischen.

+0

Ich wollte es einfach halten, denn dies ist ein Anfänger Frage. –

0

Die Situation ist in 2008 mit dem BLOCK-Konstrukt düsterer. Dieses Konstrukt gehört notwendigerweise zu den ausführbaren Anweisungen, ist aber oft nur zu dem Zweck da, die Fähigkeit hinzuzufügen, einige Spezifikationsanweisungen nach ausführbaren Anweisungen zu platzieren, etwa wenn ein angenommener Längenzeiger auf den anonymen Speicher gerichtet werden soll.

EDIT: Beispiel

module anonymous 
    use ISO_C_BINDING 
    implicit none 
    interface 
     function malloc(size) bind(C,name='malloc') 
     import 
     implicit none 
     type(C_PTR) malloc 
     integer(C_SIZE_T), value :: size 
     end function malloc 
     subroutine free(ptr) bind(C,name='free') 
     import 
     implicit none 
     type(C_PTR), value :: ptr 
     end subroutine free 
     function strlen(str) bind(C,name='strlen') 
     import 
     implicit none 
     type(C_PTR), value :: str 
     integer(C_SIZE_T) strlen 
     end function strlen 
    end interface 
    contains 
     function hello() 
     type(C_PTR) hello 
     character(LEN=*,KIND=C_CHAR), parameter :: world = & 
      'Hello, world'//C_NULL_CHAR 
     character(LEN=len(world),KIND=kind(world)), pointer :: fptr 
     hello = malloc(len(world,KIND=C_SIZE_T)) 
     call C_F_POINTER(hello,fptr) 
     fptr = world 
     end function hello 
end module anonymous 

program test 
    use anonymous 
    implicit none 
    type(C_PTR) cptr 
    character(LEN=:,KIND=C_CHAR), pointer :: fptr 
    integer(C_SIZE_T) hello_len 
    cptr = hello() 
    hello_len = strlen(cptr) 
    BLOCK 
     character(LEN=hello_len,KIND=C_CHAR), pointer :: temp 
     call C_F_POINTER(cptr,temp) 
     fptr => temp 
    end BLOCK 
    write(*,'(*(g0))') fptr(1:strlen(cptr)) 
end program test 
+0

Mit der Einschränkung, dass der Umfang der in der Sperre definierten Bezeichner nur auf den Block beschränkt ist. –

+1

Was genau meinen Sie mit dem angenommenen Längenzeiger? Und warum anonymes Ziel? –

+0

Seufzer ...Hallo, Weltprogramm hinzugefügt. – user5713492