2017-10-20 3 views
0

내 기존 서브 루틴 A(a,b,c,d,e)은 잘 작동합니다. a,b,c이 실제 인수이고 de은 선택적 인수입니다.서브 루틴 인수 목록에서 선택적 인수의 기본 연결을 비활성화하는 방법은 무엇입니까?

다른 많은 서브 루틴은 서브 루틴 A 같은

call A(a,b,c) 

이나

call A(a,b,c,d=2.0D0) 

또는

call A(a,b,c,e=1.0D0) 

지금 호출합니다.

서브 루틴 A에서 c을 제거하기로 결정했습니다. 내가 코드를 컴파일 할 때

은 그래서

subroutine A(a,b,d,e) 

되고, 같은

call A(a,b,c,e=1.0D0) 

같은 라인은 내가 원하는 없는 컴파일러에 의해 불평하지 않았다. 지금, 그것은 C가 A(a,b,d,e)

내가 을 피하도록 잘못 해석에 내 모든 코드에서 서브 루틴 A의 모든 항목을 검색 할 수 있지만, 내가 그리워도 그 중 하나는 내가 을 가고 새로운 서브 루틴의 선택적 인수 d이라고 생각 (잘못된 결과, 고뇌스러운 순간, ...) 큰 가격을 지불하지만, 좋은 속임수를 컴파일러가 불평하고 필연적으로 그들을 고쳐 보자.

이것은 내 질문을 제기합니다. 내가 = 부호를 넣지 않는 한 컴파일러에게 부탁하지 말고 옵션 변수의 기본 연결을 사용 하시겠습니까? 즉, 변수를 사용하려면 c=2.0D0, e=3.0D0으로 전달합니다. = 기호가 없으면 기본값이 아닌 선택적 인수로 설정하는 방법이 있습니까?

이렇게하면 컴파일러는 c이 수정 된 서브 루틴의 기존 변수와 일치하지 않기 때문에 분명히 불평 할 것입니다.

+0

환영합니다. [둘러보기] 및 [질문]을 읽으십시오. 적절한 형식을 지정하면 게시물이 훨씬 좋아집니다. tag [tag : fortran]을 사용하십시오. 기존의 포트란 90에 대한 응답을 제한하려면 (일반적으로 원하지 않는) [tag : fortran90]을 추가하십시오. –

답변

3

이 동작을 비활성화 할 수 없습니다. 포트란 표준 규칙은 이것을 요구합니다. Fortran이 아닌 다른 언어를 사용해야합니다.

이 문제를 방지하려면 모든 호출에서 인수 목록에있는 모든 인수에 대해 명명 된 인수를 사용할 수 있습니다.

또한 코드를 재구성하여 변경하는 데 도움이되는 도구가 있습니다 (code refactoring). 간단하게 grepsed을 사용하거나 코드 편집기의 검색 및 바꾸기 기능 (전체 프로젝트 또는 디렉토리에서 검색 할 수 있어야 함)을 사용할 수도 있습니다.

2

아마도 인수를 제거하기 전에 임시 인수로 임시 인수 C의 유형을 다른 것으로 변경하십시오. 예를 들어, 해당 인수에 대해 특별히 작성한 파생 유형의 오브젝트로 변경하십시오. 프로 시저 정의에서 해당 변경된 유형으로 컴파일하면 컴파일러에서 C에 해당하는 위치 인수가있는 프로 시저를 플래그로 표시합니다.

(C에서 사용하는 파생 유형을 정의하는 모듈 외부에서 액세스 할 수없는 경우 절차는,이 방법은 절차 기준에 항상 이름을 사용하십시오 실제 인수에 코드의 클라이언트를 강제하는 방법이다) 예를 들어

:.

subroutine proc(a, b, c, d, e) 
    real :: a, b, c, d, e 
    optional :: d, e 
    ... 

type, private :: dummy 
end type dummy 

subroutine proc(a, b, c, d, e) 
    real :: a, b, d, e 
    type(dummy) :: c 
    optional :: c, d, e 
012로 이동
+0

이것은 다음 세대의 프로그래머가 해결할 수없는 유지 보수 문제가되는 * 임시 조치 *입니다. 그래서 그 질문에 대해 충분히 오래있을 지 궁금해. * 나는 여러 서브 루틴에 선택적 인수로 사용되는 것 같은 빈 파생 형식을 포함하는 포트란 2008 프로그램이 있습니다. 누구든지 포트란이 무슨 일을하는지 말해 줄 수 있습니까? * :-) –