2013-06-07 2 views
2

Fortran 77 코드에는 공통 블록 및 동등성 선언문이 함께 사용됩니다. 예를 들어 ,Fortran 77 코드 (공통 블록 및 동등 물의 조합)에서 Fortran 90으로 전송

common /X/ a,b,c,d 
    dimension arr(4) 
    equivalent(arr(1),a) 

사람이 포트란 90 코드로 포트란 77 코드의 종류를 변환 실현 가능한 솔루션을 제공 할 수 있습니까?

+1

가장 쉬운 방법은 F77 프로그래밍의 이런 종류가 F90, F2003, F2008 ... –

+0

에서 여전히 정상이므로 메모리에서 연속적인 변수가 있다고 가정하는 것이 안전합니까? 이것은 아마도 대부분의 시간 동안 작동한다고하더라도 나에게 가난한 스타일로 충격을줍니다. – agentp

+1

@george Safe. equivalence 문은 공통 명령문에 의해 설정된 저장 순서와 배열 요소의 저장 순서 사이의 저장 연관을 지정합니다. 메모리의 레이아웃은 구현 세부 사항이지만 연속적인 메모리 덩어리가 사용 된 경우 관찰 가능한 동작이 그대로 유지되어야합니다. – IanH

답변

3

나는 equivalence 진술을 의미한다고 설명합니다. 이렇게하면 명명 된 변수가 저장 영역을 공유하게됩니다.

쉽지 않을 수 있습니다. 변수가 사용되는 방법에 따라 여러 가지 가능한 접근법이 있습니다.

등가 명령문을 사용하면 다양한 변수가 해당 저장 영역을 차지하므로 해당 변수가 변경 될 때 자동으로 업데이트됩니다. a(3)가 변경 될 때마다 때마다 b 등, a(2)이 자동으로 변경 변경, c가 자동으로 변경 등

당신은 모듈 변수에 모든 변수를 만들 수 - 전역 변수를 가지고있는 포트란 90의 방법. 등가 성명을 생략하면 더 이상 저장소를 공유하지 않습니다. 그런 다음 a(2)으로 변경 한 후 b, b = a(2) 등을 변경 한 후에 a(2) = b을 쓰면됩니다.하지만이 경우에는 프로그램에서 변수가 변경되는 모든 부분을 식별하고 해당 변수가 변경 될 때이 방법을 계속 수행해야합니다. 프로그램이 수정되었습니다. 그게 쉽지 않을 수도 있습니다.
a(2) = b 등을 쓰면 변수가 같은 유형이라고 가정합니다. 그렇지 않은 경우, equivalence의 포트란 90은 transfer 내장 함수입니다.

코드가 변수를 사용하여 수행하는 작업에 따라 두 가지 더 좋은 해결책이 있습니다. 프로그램이 동등한 명령문을 사용하여 실제로 정보를 전송하는 경우, 하나의 변수 이름 집합 만 사용하도록 코드를 다시 작성할 수 있는지 확인하십시오. 다른 이름을 사용했던 곳으로 대체하십시오. 이것은 유형이 동일한 경우에만 가능합니다.

메모리를 절약하는 데 동시에 사용되지 않는 변수를 오버레이하기 위해 프로그램에서 등가성을 사용하는 경우 더 쉽습니다. 이 경우 동등성 선언문을 제거하고 공통 변수 대신 모듈 변수를 변수로 만들 수 있으며 추가 작업이 필요하지 않습니다. 아마도 더 이상 글로벌 변수 일 필요는 없습니다. 하나의 서브 루틴이 다른 세트를 사용하고 다른 서브 루틴이 다른 세트를 사용하고 다른 서브 루틴이 다른 세트를 사용하고 다른 하나의 서브 루틴이 저장 영역을 절약하는 유일한 방법 이었으면,이를 로컬 변수로 만들 수 있습니다.

최상의 솔루션은 특정 프로그램을 이해하는 데 달려 있습니다.

equivalence 악의적 인 생각 ... 그 가치가 노력을 제거하는 좋은 금액입니다. 그러나 대규모 프로그램에 너무 깊이 삽입되면 매우 어려울 수 있습니다.

+0

공통 블록에서 변수를 업데이트해야합니다. 배열 변수 arr을 사용하여 파일에 이러한 변수를 작성해야합니다 (arr은 공통 블록의 변수와 동일한 메모리 공간을 공유하므로). 어떻게 효과적으로 구현할 수 있습니까? – witrus

+0

배열을 쓰기 전용으로 사용하는 경우 코드에서 바꿀 수 있습니다. write (...) arr은 write (...) a, b, c, d와 같습니다. 변수의 길이가 같거나 형식이 동일한 경우 변수의 형식이 동일한 경우 형식이없는 쓰기의 경우 –

+0

나는 모듈에서 포인터 변수가되도록 공통 블록의 변수를 변환하는 체계를 제안한다. 주 프로그램에서 대상 배열을 정의한다. 모듈에서 정수, pointer :: a => null을 정의한다.(), target = arr', a => arr (1), b(), b => null(), c => null => arr (2), c => arr (3)'그런 다음 arr.을 사용하여 파일에 변수 a, b, c를 씁니다.이 스키마가 실현 가능합니다. 내 계획이 다소 의미가 있다고 생각합니다. – witrus

관련 문제