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なんでしょうか)


コメント