2012-07-13 8 views
2

두 개의 시뮬레이션 코드를 함께 연결하려고합니다. 현재 3 개의 코드가 있지만 앞으로 더 많은 코드가있을 수 있습니다. 다음 다이어그램의 정보 교환을 생각할 수 있습니다 :포트란 네임 스페이스 충돌

sim1 <====> sim_main <=====> sim2 

정보 교환은 각 측면에 한정된 인터페이스를 통해 이루어집니다.

나는 최근에 sim1의 공통 블록이 세그먼트 화 오류를 일으키는 sim2의 서브 루틴과 동일한 이름을 가진 문제를 진단했습니다. 쉬운 해결책은 sim1의 공통 블록 이름을 변경하는 것입니다.하지만 sim1의 개발자가 sim1-2.0을 사용하는 경우 해당 공통 블록의 이름을 다시 변경해야합니다. 이 같이

module sim2_mod 
contains 
include "sim2.f90" 
end 

이 sim2_mod 네임 스페이스에 SIM2의 모든 루틴을 넣어해야에 use D 수 : 인터페이스가 상대적으로 제한되어 있기 때문에 더 나은 솔루션은 간단한 모듈을 작성하는 것입니다 경우, 궁금하네요 제한된 기준. 이것은 좋은 생각입니까? 나쁜 생각? 이것이 작동하지 않는 상황이 있습니까? sim2에서 사용되는 공통 블록에는 여전히 전역 범위가 있습니까?

답변

4

글쎄, sim2.f90에는 제안 된 sim2_mod에 연결하여 구문 적으로 유효한 포트란 원본 파일을 구성하는 줄만 포함되어있는 경우 제안이 작동합니다. 그렇지 않으면 소스를 편집해야합니다.

당신이하고있는 동안 당신은 그것을 모듈로 만들어 어쨌든 sim_main에서 사용할 수 있습니다. 일단 당신이 use 진술에 only 절을 약간의 이름을 붙여 추가 할 수 있고 그런 식으로 이름 충돌을 해결할 수 있습니다.

공통 블록은 실제로 프로그램 전체에 전역 범위를 가지고 있습니다. Fortran 작성 커뮤니티의 합의는이 글로벌 가용성으로 인해 발생할 수있는 문제를 피하기 위해 선호되는 방법으로, 현재 직면 한 문제뿐만 아니라, 공통 블록에 포함 된 모든 변수를 정의하는 모듈로이를 대체하는 것입니다. 그런 다음 모듈 변수를 사용하여 (이전의) 전역 변수의 가용성과 이름 지정을 조금 더 제어 할 수 있습니다.

이 방법은 구현하기가 번거롭고 sim1의 다음 릴리스도 다시 제작해야 할 필요성을 제기합니다. 그렇다면 sim1 개발자에게 공용 블록을 삭제하고 조금 더 현대적인 것을 구현한다고 말한 시점이 아닙니까?

+0

감사합니다. 비록 개발자 코드를 현대화하려고 설득하지는 않을 것이라고 생각합니다. 나는 셰프와 같이 모호한 언어를 배우고, 'sim1'을 셰프로 번역 한 다음에 그것을 결합하는 것이 더 쉬울 것이라고 생각합니다. :-p – mgilson

관련 문제