Gute Praxis Weglassen diktiert, dass Subroutine Argumente in Fortran sollte jedes eine bestimmte Absicht haben (dh intent(in)
, intent(out)
oder intent(inout)
wie beschrieben this question):Fortran Intent (INOUT-) gegen die Absicht
subroutine bar (a, b)
real, intent(in) :: a
real, intent(inout) :: b
b = b + a
...
jedoch keine Absicht, die Angabe gilt Fortran:
subroutine bar (a, b)
real, intent(in) :: a
real :: b
b = b + a
...
Sind keine wirklichen Unterschiede jenseits der Kompilierung dort für ein Argument angegeben als intent(inout)
und ein Argument, ohne einer bestimmten Prüfung Zelt? Gibt es etwas, worüber ich mich Sorgen machen sollte, wenn ich Intents zu älteren, absichtsfreien Code umrüte?
Ich habe vier Testfälle konstruiert, die versuchen, einen Parameter in einem Unterprogramm zu ändern. Zwei Tests mit externen Subroutinen - d. H. In einer Datei für sich selbst - mit und ohne Absicht (inout). Der Compiler beschwert sich nicht über diese. Dies ist keine Überraschung (keine Schnittstelle) und die resultierenden exe segfaults. Ich habe das Unterprogramm in einem Modul für die letzten beiden Tests stecken und sehe den segfault für den Fall ohne Absicht und einen Compilerfehler ("Tatsächliches Argument bei (1) muss definierbar sein, da das Dummy-Argument 'b' INTENT = OUT/INOUT ") mit der Schnittstelle. Dies ist mit gfortran 4.4.4-2 von einem Debian-System. –
Ausgezeichnet, wir haben beide etwas gelernt. –
Heute werden Parameter in einem schreibgeschützten Speicherbereich abgelegt, was jedoch nicht immer der Fall war. Das berühmte Beispiel in sehr alten Compilern war die Neudefinition von numerischen Konstanten http://coding.derkeiler.com/Archive/Fortran/comp.lang.fortran/2005-01/0485.html –