2017-09-12 1 views
1

Ich habe eine Frage in Bezug auf Best Practices der Modell/Variablenverwendung:Wie kann man geerbte Variablen in Fortran verwenden?

Nehmen wir an, ich habe ein Modul mit einigen Variablen/Parameterdefinitionen und einige Unterprogramme, die diese Variablen verwenden.

Ich brauche diese Variablen nicht explizit in den Subroutinen zu verwenden, da sie vom übergeordneten Modul geerbt werden - aber wäre es besser, dies zu tun?

Beispiel:

module test 
implicit none 

integer, parameter :: a = 1 
real    :: x 

contains 

subroutine idk(y,z) 
    real, intent(in) :: y 
    real, intent(out) :: z 

    if(a .eq. 1) then 
    z = x*y + 5. 
    else 
    z = x*y - 5. 
    end if 
end subroutine idk 

end module test 

Das obige Beispiel gut funktionieren soll, aber es wäre besser,

use test, only: a,x 

zu Deklarationsteil Unterprogramm hinzufügen idk?

In meiner Argumentation, gibt es zwei Hauptpunkte hier:

1) Pro: Explizit diese Zeile hinzufügen lassen ist leicht ich sehen, welche Variablen in dem Unterprogramm tatsächlich benötigt wird. In vielen Fällen enthält das Modul eine ganze Reihe von Variablen, aber nur wenige werden in jeder Subroutine benötigt. Aus Gründen der besseren Verständlichkeit wäre es daher sinnvoll, diese Zeile hinzuzufügen.

ABER

2) Contra: In ganz wenigen Fällen muss man eine Menge der Variablen/Parameter oben angegebenen (manchmal mehr als 100 Parameter Nummerierung). Explizit mit diesen am Anfang der Subroutine zu verwenden, macht den Code unnötig unnötig, wodurch die Lesbarkeit des Codes verringert wird.

Punkt 1 ist wichtig, wenn nur ein paar Variablen enthalten sein müssen, während Punkt 2 nur wichtig ist, wenn viele Variablen enthalten sein müssen. Aber ich denke, es wäre albern, eine Sache für wenige Variablen und eine andere für viele zu tun - sobald Sie eine Konvention gewählt haben, sollten Sie sich daran halten IMHO ...

Gibt es eine Best Practice in Bezug auf diese?

Zusatz: Alternativ könnte man das Unterprogramm als

subroutine idk(b,w,y,z) 

erklären und dann als idk(a,x,y,z) nennen.

Auf der einen Seite würde dies mir mehr Flexibilität geben, wenn ich später entscheiden würde, dass ich idk mit anderen Variablen verwenden möchte.

Auf der anderen Seite ist es auch das Risiko von Fehlern erhöht, wenn ich etwas später ändern (sagen wir, ich merke, ich brauche nicht Parameter a als Bedingung aber Parameter c. In den ersten Fällen schalte ich aus einfach a ->c im Unterprogramm Aber im letzten Fall, ich brauche jeden Anruf zu idk(c,...) ändern, wenn es einer Menge dieser Anrufe ist, dies ist anfällig für Fehler)

ich würde wirklich zu schätzen Sie Ihre Eingabe..! Vielen Dank!

+0

BTW siehe https://meta.stackexchange.com/questions/2950/should-hi-thanks-taglines-and-salutations-be-removed-from-posts und https://meta.stackexchange.com/questions/141747/i-say-thank-you-and-es-bekommt-edited-out –

+0

eine andere Alternative wäre, die Parameter in ein separates Modul zu setzen. – agentp

+0

Ich nähere mich immer sehr vorsichtig der Host-Assoziation und dokumentiere das Ganze im Quellcode. Beachten Sie, dass selbst dann, wenn Sie sich entscheiden, die notwendigen Variablen als Argumente an eine interne Prozedur zu übergeben, die Hostvariablen immer noch "versehentlich" aufgerufen/geändert werden können. Ich denke, das ist schlimmer als vergessen, Variablen an eine externe Subroutine zu übergeben, denn in diesem Fall würden Sie den Fehler sofort sehen. –

Antwort

1

Es gibt absolut keinen Grund zu use das Modul wird gerade definiert. Es ist illegal.Es kann passieren, zu kompilieren, wenn das Modul zuvor kompiliert wurde und der Compiler die .mod Datei finden kann, aber Datei, aber ansonsten ist es falsch.

Sie sollten Fehler erwarten wie

ifort -c assoc.f90 
assoc.f90(10): error #6928: The module-name on a USE statement in a program unit cannot be the name of any encompassing scoping unit. [TEST] 
    use test 
------^ 

Das Modul Unterprogramm die Variablen aus der Host-Modul durch Ausrichterverband und die use Anweisung erhält, ist für Verwendung Verein. Dies sind zwei verschiedene Dinge und sollten nicht gemischt werden.

Wenn Sie globale Variablen vermeiden möchten, übergeben Sie sie als Argumente. Dies ist ein allgemeiner Hinweis. Was am besten ist, hängt von jedem Fall und dem Programmierer ab und kann nicht allgemein beantwortet werden.

+0

Vielen Dank für Ihre Antwort! Ich hatte nie Compiler Probleme mit Gfortran aus diesem Grund (auch wenn keine '.mod 'Datei vorhanden war), also nahm ich einfach an, dass beides erlaubt war. Ich nehme an, _host association_ ersetzt _use association_? Also, wenn ich 'some_mod, nur: some_variable' in meinem Modul' test' verwende, dann muss (und soll) ich das nicht nochmal in der enthaltenen Subroutine 'idk' machen? – ConfusedProgrammer

+0

Sie * können * dies in der Subroutine wieder tun, aber Sie müssen nicht. Sofern es sich auf ein anderes Modul bezieht. –

+0

Gfortran gibt mir 'Fatal Error: Moduldatei 'test.mod' zum Lesen bei (1) kann nicht geöffnet werden: Keine solche Datei oder kein Verzeichnis'. –

Verwandte Themen