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