2012-09-05 4 views
1

필자는 텍스트 파일에서 수백 개의 입력을 읽고 그것들에 대해 많은 다른 순차 연산을 수행하는 프로그램을 Fortran 90에 작성했습니다."글로벌"사용을 위해 모듈에 프로그램 입력 저장

각 서브 루틴에이 수백 개의 값을 계속 전달하고 싶지 않습니다 (많은 수가 있습니다!). 이 파일에서 읽은 데이터를 모든 서브 루틴에서 액세스 할 수있는 전역 변수에 저장할 수있는 방법이 있습니까? 어떻게 든이 값을 각 서브 루틴에서 호출 할 수있는 모듈에 저장할 수 있다고 상상합니다. 그러나 그렇게하는 방법은 확실하지 않습니다.

답변

5

변수를 모듈에 배치하고 각 서브 루틴에서 해당 모듈을 사용하기 만하면됩니다. 또는 동일한 모듈에 서브 루틴이 있습니다. 이것은 현대 Fortran에서 전역 변수에 대해 선호되는 접근 방식입니다. 공통 블록보다 선호됩니다. 공통 블록은 저장 시퀀스의 불필요한 복잡성을 추가합니다. 원칙적으로 각 선언에 SAVE를 포함시켜야합니다. 왜냐하면 모듈이 범위를 벗어나면 값을 잃어 버릴 수 있습니다. 즉, 프로그램 실행 중에 주 프로그램이나 서브 루틴이 모듈을 사용하지 않으면 값을 잃을 수 있기 때문입니다. 아마 컴파일러는 실제로 이것을하지 않습니다.

module my_mod 

    real, dimension (100) :: array 
    integer :: OneInt 

contains 

subroutine X 

end subroutine X 

end module my_mod 

program my_prog 


use my_mod 

read() array 

call subroutine X 

end program my_prog 
+0

도움 주셔서 감사합니다. 모듈에서 본 교과서 예제의 많은 부분에서 모듈은 매개 변수를 보유하기 위해 독점적으로 사용되었으므로 값을 모듈에서 명시 적으로 선언하고 다른 곳에서 가져 오지 않아야한다고 가정했습니다. – frostbyyte

4

직교 모듈 변수의 사용으로, (특정 파생 형으로 분류되는 몇 가지 방법에 관련된 값) "값 수백"그룹화하여 하나 이상의 도출 된 타입의 사용을 고려.

(더 기본적인 수준, 오히려 스칼라의 시리즈에 비해 배열의 정보 때때로 표현에서 그 정보의 성격에 더 적합하다 - 그래서 저장하고 배열에서 해당 정보를 전달합니다.)

이가 있습니다 프로그램의 정보 흐름을 이해하는 것이 훨씬 쉽습니다. 프로 시저 참조 사이트에서 코드를 읽는 누군가는 참조 된 프로 시저가 액세스 할 수있는 모듈 및 모듈 변수를 반드시 알지 못합니다. 어떤 경우에는 미래에 프로그램을보다 쉽게 ​​확장 할 수 있습니다. 일련의 모듈 변수가 아닌 파생 된 유형으로 설명되는 경우 여러 기존 인스턴스를 갖는 것이 더 쉽습니다.

그래서 대신 :

SUBROUTINE proc(temperature, pressure, & 
    composition_a, composition_b, composition_c) 
    REAL, INTENT(IN) :: temperature, pressure, & 
     composition_a, composition_b, composition_c 
... 

이 고려 : 다른 경우에는

TYPE State 
    REAL :: temperature 
    REAL :: pressure 
    REAL :: composition(3) 
END Type State 
... 
SUBROUTINE proc(system_state) 
    TYPE(State), INTENT(IN) :: system_state 
... 

모듈 변수가 아니라 더 적합 할 수 있습니다 - 분할은 판단의 문제이다.

+0

조언 해 주셔서 감사합니다. "비슷한"변수에 대한 배열을 사용하고 있지만 실제로 다른 유추 된 데이터 형식을 사용하고 있지는 않습니다. 이는 실제로 유익 할 것입니다. – frostbyyte