FORTRAN(cutコマンドを作るその4)

FORTRANでcutコマンドです。-bオプションの範囲指定もできるようにします。 範囲は-(ハイフン)で指定します。
最初にSPLIT関数の改造です。今はカンマ限定なので、ハイフンも指定できるように引数指定できるようにします。

      SUBROUTINE SPLIT(SRC,DEST,SPLIT_SIZE)

20100   RSLT = INDEX(SRC(IND+1:),',')

これをこのように変更。セパレータという意味でSEPという変数名にしました。

      SUBROUTINE SPLIT(SRC,SEP,DEST,SPLIT_SIZE)

        ~

        CHARACTER*1 SEP

        ~

20100   RSLT = INDEX(SRC(IND+1:),SEP)

テストプログラムを作って修正したSPLIT関数を動かします。
最初に,(カンマ)でスプリットして、スプリット後の各要素を-(ハイフン)でスプリットします。

takk@deb9:~$ cat split2.f
      PROGRAM MAIN
        CHARACTER*100 STRING
        CHARACTER*10 SSTRING1(10),SSTRING2(10)
        INTEGER I,SSIZE1,SSIZE2

        STRING='1-3,5,7-12,13,14'
        WRITE(*,*) STRING

        CALL SPLIT(STRING,',', SSTRING1,SSIZE1)
        WRITE(*,1100) SSIZE1

        DO 100 I=1,SSIZE1

          WRITE(*,1300) SSTRING1(I)

          CALL SPLIT(SSTRING1(I),'-', SSTRING2,SSIZE2)
          WRITE(*,1200) SSIZE2

  100   CONTINUE
 1100   FORMAT('SIZE1=',I3)
 1200   FORMAT('  SIZE2=',I3)
 1300   FORMAT('[',A,']')

        STOP
      END

      SUBROUTINE SPLIT(SRC,SEP,DEST,SPLIT_SIZE)
        CHARACTER*100 SRC
        CHARACTER*1 SEP
        CHARACTER*10 DEST(10)
        INTEGER IND,S1,S2,RSLT,SPLIT_SIZE
        IND = 0
        S2=-1
        I = 1
20100   RSLT = INDEX(SRC(IND+1:),SEP)
        IF(RSLT.NE.0) THEN
          S1 = IND+1
          IND = IND + RSLT
          S2 = IND-1
          DEST(I) = SRC(S1:S2)
          I = I + 1
          GOTO 20100
        END IF
        DEST(I) = SRC(S2+2:)
        SPLIT_SIZE = I
        RETURN
      END
takk@deb9:~$

実行します。

takk@deb9:~$ ./a.out
 1-3,5,7-12,13,14                                                                   
SIZE1=  5
[1-3       ]
  SIZE2=  3
[5         ]
  SIZE2=  2
[7-12      ]
  SIZE2=  2
[13        ]
  SIZE2=  1
[14        ]
  SIZE2=  1
takk@deb9:~$

ん~。何か間違ってます。1回目のSPLITの結果としてSIZE1に分割数を格納してますが、SIZE1=5なので合ってるのですが、2回目のSPLITの結果のSIZE2が間違ってます。
こつこつデバッグしていこうかと思います。(FORTRANもデバッグはGDBなんでしょうか)

Leave a Reply

Your email address will not be published. Required fields are marked *

CAPTCHA