ENCODE와 DECODE 문(ENCODE and DECODE statements)

ENCODE와 DECODE 문(ENCODE and DECODE statements)

GNU Fortran이 지원하지 않는 ENCODE·DECODE 문을 어떻게 대체할 수 있는지 알려주는 문서예요. 이 두 문은 오래된 컴파일러 확장인데, 표준에 맞는 READ·WRITE와 내부 파일(internal file)로 쉽게 바꿀 수 있어요.

출처: ENCODE and DECODE statements (The GNU Fortran Compiler)

본문

GNU Fortran은 ENCODEDECODE 문을 지원하지 않아요. 이 문들은 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))

핵심은 DECODEREAD, ENCODEWRITE로 바꾸고, 바이트 배열 대신 CHARACTER(LEN=80) 같은 내부 파일을 사용하는 거예요. 그러면 같은 FORMAT을 그대로 쓰면서 표준 문법으로 깔끔하게 옮길 수 있어요.

더 알아보기

  • 내부 파일(internal file)은 Fortran 77 이후 표준 기능이라 이식성이 좋아요. 문자 변수나 문자 배열을 UNIT=으로 쓰면 입출력이 그 메모리에서 바로 이뤄져요.
  • FORMAT 9000처럼 라벨이 있는 형식은 그대로 재사용할 수 있어서 마이그레이션 비용이 작아요.
  • 바이트 단위로 다루던 INTEGER*1 LINE(80)을 문자로 바꿀 때는, 바이트와 문자의 길이가 일치한다고 가정할 수 있는 환경(대개 1바이트 문자)에서 안전해요.