2011-12-21 3 views
4

코드 :등가 문

program CheckEquivalence 
    integer*8 intarray(4) 
    real*8 realarray(4) 

    equivalence(realarray,intarray) 
    realarray(3) = 3 
    intarray(4) = 4 
    realarray(1) = 1.0 
    realarray(2) = 2.0 

    do i = 1,4 
    write(,) 'All real ', realarray(i) 
    enddo 
    do i = 1,4 
    write(,) 'All int ', intarray(i) 
    enddo 
    do i = 1,3 
    write(,) 'Some real ', realarray(i) 
    enddo 
    write(,) 'Last int ', intarray(4) 
end 

출력은 다음과 같습니다

All real 1. 
All real 2. 
All real 3. 
All real 1.97626258E-323 
All int 4607182418800017408 
All int 4611686018427387904 
All int 4613937818241073152 
All int 4 
Some real 1. 
Some real 2. 
Some real 3. 
Last int 4 

나는 등가의 작동 방식을 이해하는 하나 개의 샘플 코드를 시도했다. 내 쿼리의 형식은 내부적으로 데이터가 이고 이론적으로 동일한 값을 얻을 수있는 알고리즘이 저장되어 있습니까?

답변

6

으로는 여기에 대답

equivalence statements in fortran

두 값 사이에 변환이 없습니다. 변수에 쓰는 내용을 기반으로 저장되고 액세스 방법에 따라 해석됩니다. 따라서 REAL에 실수 값을 쓰고 정수 변수를 인쇄하려고하면 쓰레기가 생깁니다. 그 반대.

일반적으로 EQUIVALENCE 문을 사용하지 마십시오. 그들은 나쁜 생각이고 비추천입니다. 새 코드를 작성하는 경우에는 코드를 넣지 마십시오. 예전 코드를 해석하려는 경우 일반적으로 다른 위치에 동일한 위치를 다시 사용하여 메모리에 컴팩트 저장 장치를 만드는 데 사용됩니다.

1

예, 이미 답변 했으므로 등가성을 사용할 이유가 거의 없습니다. 수십 년 전에 배열을 겹쳐서 메모리를 절약하기 위해 일반적으로 사용되었습니다. 또한 낮은 수준의 비 휴대용 조작에도 사용할 수 있습니다. 실수를 저장하고 정수로 출력하면 결과는 사용중인 하드웨어의 숫자 표현에 따라 언어 표준 외부에서 옮길 수 없습니다. 바이너리 데이터를 읽고 유형을 결정하는 등 비트 수준 조작을해야하는 경우가 있습니다. 또는 바이트 스왑을 수행합니다. EQUIVALENCE에 대한 현대적인 대체는 "전송"내장 함수입니다.