2012-04-05 2 views
0

저는이 F77 코드에서 COMMON BLOCKS를 광범위하게 사용하고 있으며 공통 블록은 C 프로그램 (이름 맹 글링 후)에서도 사용됩니다. foo (a, b, ...)가 fortran 코드의 주요 루틴이라면 공통 블록을 foo()에 로컬로 만들어 어쨌든 다음과 같이 할 수 있습니까?Fortran 77에서 공통 블록 변수의 범위를 현지화합니다.

program new_control_routine() 

... 
call foo(a1,b1,...) 
... 
call foo(a2,b2,...) 
... 
end 

점은 그 블록이 같은 이름을 가지고, 비록 그들이 독립 일반적인 블록을 갖는 각각 "foo는"여러 통화를하는 것입니다. 내가 아는 유일한 방법은 "foo는"의 두 번째 호출에서 일반적인 블록 및 관련 서브 루틴의 이름을 변경하는 것입니다, 그래서 다른 루틴 "foo1은"이됩니다, 그래서 내가 할 수있는 :

programe new_control_routine() 
... 
call foo(a1,b1,...) 
... 
call foo1(a2,b2,...) 

을하지만이 확실히 평범한이며, 발생하기 쉬운 오류.

답변

1

공통 블록의 핵심은 해당 블록이 전역이며 이름을 사용하는 모든 루틴에서 액세스 할 수 있다는 것입니다. 공통 블록 배열의 변수를 만들고 색인을 전달하여 다른 호출이 다른 요소에 액세스 할 수 있습니까?

왜 자신을 포트란 77로 제한합니까? Fortran 95/2003을 사용하면 사용자 정의 유형을 작성하고 해당 유형의 배열 변수를 작성할 수 있습니다. 그런 다음 작업 할 요소의 색인을 전달합니다. 사용자 정의 유형은 복잡한 변수 그룹 일 수 있습니다. 변수는 서브 루틴이나 모듈 변수의 인수가 될 수 있습니다.

+0

불행히도이 코드는 기존 코드이며 지난 20 년 동안 수행 된 작업을 수행하는 데 많은 선택의 여지가 없습니다. 수백 개의 공통 블록이 있습니다. 그리고 색인 아이디어에 감사드립니다. – taki

+1

@taki - 알 수없는 이유로 변경하지 않으려는 귀하의 코드를 사용하는 다른 사용자가없는 한, 가장 최근의 개정판 (적어도 F90)으로 "업그레이드"할 수없는 이유는 없습니다. 오늘날 보수적 인 견해로도 F77을 주장하는 것은 부당합니다. 또한 많은 사용자가 라이브러리를 최신 버전으로 업그레이드 할 때 환영합니다. 나는 재 작성에 대해 생각하지 않지만, 언어의 새로운 기능의 느린 소개 ... – Rook

+0

@ldigas - 감사합니다. 그것은 결국 여기 사람들이 할 수 있습니다. – taki