2013-09-26 2 views
1

매우 구체적인 형식의 함수를 전달해야하는 fortran 라이브러리가 있습니다. 그런 다음 라이브러리가 내 기능에서 일부 작업을 수행하고 있습니다. 함수는 (나 같은) 사용자에 의해 쓰여지고 라이브러리는 당연하게 주어진다.Fortran 90 이상의 전역 변수를 피하는 방법은 무엇입니까?

불행히도 내 함수를 계산하려면 몇 가지 값이 필요합니다. 그 중 일부는 기본으로 한 번만 초기화 될 수 있으며 common 또는 save은 사용하지 않는 것이 좋습니다.

나는 싱글 톤 패턴을 사용할 수 있다고 읽었지 만, 나는 템플릿의 전문가가 아니며, 일부 사람들은 그 사용법을 비판합니다. 그래서, 내 함수의 인수에 그것을 가질 수 없다하더라도 함수 내에서 변수를 전달할 수 있습니까? 당신이 포트란 MODULE를 정의하면, 당신은 당신의 기능은 메인 프로그램에서 정의되지 않은 몇 가지 변수를 사용할 수 있습니다

+0

어떤 라이브러리를 사용 하시겠습니까? 모든 사람들이 사용할 수 있다면 실험해볼 수 있습니다.) – Stefan

+1

http://www.amazon.co.uk/Modern-Fortran-Practice-Arjen-Markus/dp/1107603471에서는 Fortran 90에서 FORTRAN77에서이 문제를 해결하는 방법을 보여줍니다./95, 2003 및 2008 (* ie * 4 가지 방식으로). 필자는 현재 현재 사용 가능한 가장 좋은 포스트 소개 포트란 (Fortran) 서적이라고 생각하는 것을 연결하기 만하면됩니다. –

+0

@ Stefan; 그것은 커스텀 루틴이지만 f (x) thet 내부의 값 "g"가 필요하다고 생각할 수 있습니다 – ray

답변

3

:

MODULE mymod 
    REAL :: x = 1.35 
    INTEGER :: y = 16 

CONTAINS 
    FUNCTION results(a,b) 
     REAL :: a, results 
     INTEGER :: b 
     results = a*x+real(b+y) 
    END FUNCTION results 

END MODULE mymod 

PROGRAM extrn_func 
    USE mymod, ONLY: results 
    PRINT *,results(1.0, 3) 
END PROGRAM extrn_func 

비록,이 방법은 기본에 USE mymod 문을 추가 할 수 있도록 당신이 필요합니다 프로그램.

+0

이것은 참으로 내가 끝낸 것입니다. 어쨌든 값을 private로 선언하고 초기화를 허용하는 함수를 추가하고 모듈 내의 논리적 인 개인 변수를 검사하여 단 하나의 초기화 만 허용합니다. 이것은 실수로 재 초기화되는 것을 방지해야합니다. 이 솔루션은 잠재적으로 스레드가 안전하지 않습니까? – ray

관련 문제