2014-12-17 7 views
5

저는 Fortran에서 서브 루틴과 함수의 주된 차이점은 함수가 값을 리턴한다는 것입니다. 서브 루틴은 인수로 전달 된 값의 일부 또는 전부를 변경합니다. 그러나 함수에 전달 된 변수를 인자로 수정할 수 있다는 것도 배웠습니다. 나는 혼란스럽고 그들 사이의 차이점에 대한 좋은 참고 자료를 찾을 수 없다.Fortran에서 함수와 서브 루틴의 차이점은 무엇입니까?

그래서 두 구성 간의 차이점은 무엇이며 언제 그리고 왜 다른 쪽보다 우선해야합니까?

+2

가장 큰 차이점은 서브 루틴은'CALL' 문을 통해 호출되므로 표현식의 일부가 될 수 없다는 것입니다. –

답변

7

프로그래밍 스타일을 사용할지 여부는 다소 다릅니다. 함수와 서브 루틴의 인수를 intent(in), intent(inout) 또는 intent(out)으로 쓸 수 있습니다.

그러나 내 개인적인 스타일은 intent(in) 함수의 인수 만 사용해야하며 이는 pure 함수의 요구 사항이기도합니다. 오류 코드 intent(out) 인수가 필요한 경우이 규칙의 예외가 적용될 수 있습니다.

동일한 입력 인수 값에 대해 다른 결과를 반환하는 함수에는 숨겨진 미묘한 함정이 있습니다. 고려 가상 함수가 한 번

x = rnd() 

을 요구하는 임의의 숫자

real function rnd() 
end function 

를 반환하는 것은 완전히 OK이다. 단일 표현식에서 여러 번 호출

x = (rnd() + rnd())/2 

이 함수는 한 번만 호출 될 수 있습니다. Fortran 언어 규칙은 이러한 동작을 허용합니다. 따라서 난수를 얻기위한 표준 포트란 절차는 서브 루틴입니다 (그리고 모든 내장 함수는 pure이기 때문에).

함수를 사용할 수없는 곳에서는 서브 루틴을 사용하십시오.

모든 함수는 결과 변수를 intent(out) 인 더미 인수로 이동하여 서브 루틴으로 변환 할 수 있습니다. 반대의 과정은 더 문제가 될 수 있습니다.