728x90
반응형

1. 외부 함수 (External Functions)

주 프로그램의 END문 다음에 부프로그램을 작성한다. 

 

예제 - 외부 부프로그램

온도 변환

! 온도 변환 외부함수 사용 버전 p219
PROGRAM Temperature_Conversion_6
    !implicit none
    real Celsius_to_Fahr
    real :: fahrenheit, celsius
    character(1) :: response
        
    DO
        ! Get a Celsius temperature
        write (*, '(1x, A)', ADVANCE = "NO") "Enter a Celsius temperature:"
        read *, Celsius
    
        ! Use the module function Fahr_to_Celsius to convert it to Celsius       
        Fahrenheit = Celsius_to_Fahr(celsius)
        
        ! Output the result
        print '(1x, 2(F6.2, A))', celsius, & 
            " in Celsius is equivalent to ", fahrenheit, " in Fahrenheit"
        
        ! Check if more temperautre ar to ber converted
        write (*, '(/ 1x, A)', ADVANCE = "NO") &
               "More temperatures to convert (Y or N)?"
        read *, response
                
        IF (response /= "Y") EXIT
    END DO
pause
    END PROGRAM Temperature_Conversion_6

    
Function Celsius_to_Fahr(Temp)
    implicit none
    real :: Celsius_to_Fahr
    real, intent(in) :: Temp        
    Celsius_to_Fahr = (Temp - 32.0) /1.8
End Function Celsius_to_Fahr

 

2. 인터페이스(interface)

주 프로그램과 외부 부프로그램은 별개의 독립적 프로그램 단위이다. 따라서, 어떤 부 프로그램 내에서 지역적으로 선언된 항목을 외부 부프로그램이 접근하여 사용할 수 없다. 서로 다른 프로그램 간의 정보를 넘겨받을 수 있는 유일한 방법은 인수 함수이름을 사용하는 것이다. 

 

명시적 인터페이스: 내부 부프로그램과 모듈 부프로그램은 주프로그램 내에 위치하거나 USE문 이후에 나오는 코드에서 인수정보가 전달되므로, 컴파일러는 정확하게 정보전달을 확인할 수 있다. 

묵시적 인터페이스: 외부 부프로그램은 주프로그램으로 부터 분리되어 있으므로, 컴파일러는 인수 정보 전달이 정확한지 확인하지 못할 수도 있다. 따라서, 외부 부프로그램도 인수전달이 정확하게 이루어지는지 명시적으로 판단하도록 할 수 있어야 하는데, 이때 인터페이스 블럭을 사용한다. 

INTERFACE
    인터페이스 본체
END INTERFACE

인터페이스 본체는 1) 부프로그램 헤더, 2) 형선언, 3) END FUNCTION (또는 SUBROUTINE) 으로 구성된다. 

 

예제 - 인터페이스 

! 온도변환 모듈 사용 버전 p214-216
PROGRAM Temperature_conversion_4
    implicit none
    
    INTERFACE      
        Function Fahr_to_Celsius(Temp)
            real :: Fahr_to_Celsius
            real, intent(in) :: Temp                    
        End Function Fahr_to_Celsius    
        
        Function Celsius_to_Fahr(Temp)
            real :: Celsius_to_Fahr
            real, intent(in) :: Temp        
        End Function Celsius_to_Fahr    
    END INTERFACE
    
    real :: fahrenheit, celsius
    character(1) :: response
    
    DO 
        ! Get a Celsius temperature
        write (*, '(1x, A)', ADVANCE = "NO") "Enter a Celsius temperature:"
        read *, Celsius
    
        ! Use the module function Fahr_to_Celsius to convert it to Celsius       
        Fahrenheit = (9/5) * Celsius + 32.0       
        
        ! Output the result
        print '(1x, 2(F6.2, A))', celsius, & 
            " in Celsius is equivalent to ", fahrenheit, " in Fahrenheit"
        
        ! Check if more temperautre ar to ber converted
        write (*, '(/ 1x, A)', ADVANCE = "NO") &
               "More temperatures to convert (Y or N)?"
        read *, response
                
        IF (response /= "Y") EXIT
    END DO
pause
END PROGRAM Temperature_Conversion_4

 

728x90
반응형

+ Recent posts