ENCODE와 DECODE 문(ENCODE and DECODE statements)
ENCODE와 DECODE 문(ENCODE and DECODE statements)
GNU Fortran이 지원하지 않는 ENCODE·DECODE 문을 어떻게 대체할 수 있는지 알려주는 문서예요. 이 두 문은 오래된 컴파일러 확장인데, 표준에 맞는 READ·WRITE와 내부 파일(internal file)로 쉽게 바꿀 수 있어요.
본문
GNU Fortran은 ENCODE와 DECODE 문을 지원하지 않아요. 이 문들은 Fortran 77부터 표준의 일부가 된 내부 파일(CHARACTER 변수와 배열)을 사용하는 READ·WRITE 문으로 바꾸는 것이 가장 좋아요.
예를 들어, 아래와 같은 코드 조각이 있었다고 해볼게요.
INTEGER*1 LINE(80)
REAL A, B, C
c ... Code that sets LINE
DECODE (80, 9000, LINE) A, B, C
9000 FORMAT (1X, 3(F10.5))
이걸 다음과 같이 바꾸면 돼요.
CHARACTER(LEN=80) LINE
REAL A, B, C
c ... Code that sets LINE
READ (UNIT=LINE, FMT=9000) A, B, C
9000 FORMAT (1X, 3(F10.5))
비슷하게, 출력을 만드는 ENCODE 문도 동일한 방식으로 대체할 수 있어요. 원래 코드가
INTEGER*1 LINE(80)
REAL A, B, C
c ... Code that sets A, B and C
ENCODE (80, 9000, LINE) A, B, C
9000 FORMAT (1X, 'OUTPUT IS ', 3(F10.5))
였다면, 이렇게 바꾸면 되죠.
CHARACTER(LEN=80) LINE
REAL A, B, C
c ... Code that sets A, B and C
WRITE (UNIT=LINE, FMT=9000) A, B, C
9000 FORMAT (1X, 'OUTPUT IS ', 3(F10.5))
핵심은 DECODE→READ, ENCODE→WRITE로 바꾸고, 바이트 배열 대신 CHARACTER(LEN=80) 같은 내부 파일을 사용하는 거예요. 그러면 같은 FORMAT을 그대로 쓰면서 표준 문법으로 깔끔하게 옮길 수 있어요.
더 알아보기
- 내부 파일(internal file)은 Fortran 77 이후 표준 기능이라 이식성이 좋아요. 문자 변수나 문자 배열을
UNIT=으로 쓰면 입출력이 그 메모리에서 바로 이뤄져요. FORMAT 9000처럼 라벨이 있는 형식은 그대로 재사용할 수 있어서 마이그레이션 비용이 작아요.- 바이트 단위로 다루던
INTEGER*1 LINE(80)을 문자로 바꿀 때는, 바이트와 문자의 길이가 일치한다고 가정할 수 있는 환경(대개 1바이트 문자)에서 안전해요.