2017-02-27 11 views
0

서브 루틴 호출에 문제가 있습니다. 우선, IF 문 내에서 서브 루틴을 호출 할 수 있습니까?다른 서브 루틴 내에서 서브 루틴 호출

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

두 번째 질문. Sub1은 sub2를 호출합니다. 그러면 sub2는 주 프로그램의 입력을 가지고 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 

참고 : 변수 사이의 추가

은 기본적으로 모든 변수가 서로에 따라 정확한 수학 연산 일어나는 것이 아니라, X = Y는 내가 유일한 방법이라고 생각 초기 조건 이것은 효과가있을 수 있습니다. sub2가 초기 x = y에서 픽업되지 않는 것 같습니다. 그러면 sub1에서 호출 될 때 sub1에 값을 제공합니다. 어쩌면 변수가 전달되는 방식을 이해하지 못할 수도 있습니다. 내가 얻는 오류는 컴파일하는 것이 아니라 실행 시간 오류로 인해 sub1 내에서 sub2라고 부르는 선으로 연결됩니다. 어떤 도움이라도 대단히 감사합니다.

+0

기존 답변을 말도 안하는 변경하지 마십시오. 새로운 질문으로 새로운 질문을하면 새로운 질문을하십시오. 또는 자신의 대답에 대해 확신이없는 경우 먼저 다른 사람에게 의견을 말하도록 요청하십시오. –

+0

사실, 실제 코드에 있다고 말하면 변경 사항을 되돌려 놓았지만 : 1. "단순화 된"코드를 게시하지 마십시오. 2. 내가 가지고있는 해답과 내가 연결된 질문에 대한 해답을 읽으십시오. 서브 루틴의'x'와'y'는 지역 변수입니다. 암시 적으로 선언되었거나'real x, y'로 선언하면 상관 없습니다. 그것들은 여전히 ​​서브 루틴의 로컬 변수입니다. –

+0

혼란을 야기하지는 않았다. 이해합니다, 고마워요. – Dtaai

답변

0

모든 프로그램 및 모듈의 시작 부분에 implicit none을 사용하고 (USE 문장 만 사용하십시오) 모든 변수를 명시 적으로 선언하십시오.

서브 루틴을 호출 한 것처럼 완벽하게 괜찮 으면서도 변수의 범위를 고려해야합니다.

예에서 sub1은 주 프로그램의 로컬이므로 로컬 프로그램의 xy에 액세스 할 수 없습니다.

+0

죄송합니다. 방금 편집했습니다. 그래도 내 진짜 코드에 그것을 가지고있다. 이 경우 sub1은 x 또는 y를 필요로하지 않지만 주 프로그램에서 x가 필요한 sub2에서 z가 필요합니다. – Dtaai

+0

제가 링크 된 질문에 대한 제 대답을보십시오. x와 y는 서브 루틴과 메인 프로그램에서 x와 y가 같지 않습니다. –