2017-02-27 6 views
0

Ich habe einige Probleme beim Aufruf von Subroutinen. Zuallererst, darf ich eine Subroutine innerhalb einer IF-Anweisung aufrufen?Aufruf einer Unterroutine in einer anderen Unterroutine

IF (...) THEN 
    ... 
ELSE 
    CALL sub1(...) 
END IF 

Zweite Frage. Sub1 ruft sub2 in sich auf. Dann hat sub2 eine Eingabe vom Hauptprogramm, sagen wir mal x.

MODULE mod1 
    ... 
CONTAINS 

    SUBROUTINE sub1(w) 

    IMPLICIT NONE 
    INTENT(OUT) :: w 
    REAL :: x, z 

    CALL sub2(x, z) 

    w = z + 1 

    END SUBROUTINE sub1 

    SUBROUTINE sub2(x, z) 

    IMPLICIT NONE  
    INTENT(IN) :: x 
    INTENT(OUT) :: z 

    z = x + 1 

    END SUBROUTINE sub2 

END MODULE mod1 

PROGRAM prog 

    USE mod1 
    IMPLICIT NONE 

    IF (...) THEN 
    ... 
    ELSE 
    x = y 
    CALL sub1(w) 
    x = w + y 
    END IF 

END PROGRAM prog 

HINWEIS: Die Zugabe zwischen Variable ist nicht die genaue mathematische Operation statt

Grundsätzlich kann jede Variable aufeinander ab, aber die x = y ist die erste Bedingung, die ich denke, der einzige Weg ist, das könnte funktionieren. Es scheint, dass das Sub2 nicht das anfängliche x = y aufnimmt, das dann seinen Wert an sub1 gibt, wenn es von sub1 aufgerufen wird. Vielleicht verstehe ich nicht, wie die Variablen herumgereicht werden. Die Fehler, die ich bekomme, sind nicht beim Kompilieren, sondern ein Laufzeitfehler, der mich zu der Zeile führt, wo ich Sub2 innerhalb von Sub1 anrufe. Jede Hilfe wird sehr geschätzt.

+0

Bitte machen Sie keine Änderungen, die bestehende Antworten Unsinn machen. Wenn Sie eine neue Frage mit einem neuen Code haben, stellen Sie eine neue Frage. Oder fragen Sie jemanden, der in einem Kommentar geantwortet hat, wenn Sie sich nicht sicher sind, was er gesagt hat. –

+0

Ok, ich habe mich zu Ihrer Änderung gewendet, wenn Sie sagen, dass es in Ihrem echten Code ist, aber: 1. Poste niemals solchen "vereinfachten" Code. 2. Lesen Sie die Antwort, die Sie erhalten haben, und die Antworten auf die Frage, die ich verlinkt habe. Die "x" und "y" in der Subroutine sind lokale Variablen. Es spielt keine Rolle, ob sie implizit deklariert werden oder Sie deklarieren sie mit 'real x, y'. Sie sind immer noch lokale Variablen des Unterprogramms. –

+0

Ich wollte nicht Verwirrung stiften. Ich verstehe jetzt, danke. – Dtaai

Antwort

0

Verwenden Sie bitte implicit none am Anfang aller Ihrer Programme und Module (nur USE Anweisungen davor), und deklarieren Sie dann alle Variablen explizit.

Während es völlig in Ordnung ist, Ihre Unterprogramme so aufzurufen, wie Sie es getan haben, müssen Sie den Umfang der Variablen berücksichtigen.

In Ihrem Beispiel hat sub1 keinen Zugriff auf die Hauptprogramm x und y, da sie lokal für das Hauptprogramm sind.

+0

Entschuldigung, gerade bearbeitet. Ich habe es aber auf meinem echten Code. In diesem Fall würde sub1 nicht x oder y benötigen, aber wird z von sub2 benötigt, was x vom Hauptprogramm benötigt. – Dtaai

+0

Bitte werfen Sie einen Blick auf meine Antwort auf die Frage, die ich verlinkt habe. Die x und y sind im Unterprogramm und im Hauptprogramm nicht gleich x und y. –

Verwandte Themen