FORTRAN(自作splitのデバッグその2)

続きです。

自作のSPLIT関数を呼び出しするときに、文字列
‘1-3 ‘を引数で渡しているのに関数内部の方宣言の文字列サイズが大きいことが原因っぽいですが、実験プログラムを作って確認します。

takk@deb9:~$ cat test.f
      PROGRAM MAIN
        CHARACTER*10 AA
        AA='ABCDEFGHIJ'
        CALL TEST(AA)
      END

      SUBROUTINE TEST(SRC)
        CHARACTER*100 SRC
        WRITE(*,*) SRC
        RETURN
      END
takk@deb9:~$

このようなプログラムになりました。TEST関数に渡す文字列サイズは10Byteで、TEST関数の引数はサイズを100Byteにしています。
ビルドします。

takk@deb9:~$ gfortran -g test.f
test.f:4:18:

         CALL TEST(AA)
                  1
Warning: Character length of actual argument shorter than of dummy argument ‘sr ’ (10/100) at (1)
takk@deb9:~$

実引数と仮引数のサイズが違うというwarningが出ました。
サイズを合わせれば、warningは出なくなるのでしょうか。

 CHARACTER*10 AA

10を100に変更して、

 CHARACTER*100 AA

再度ビルドします。

takk@deb9:~$ gfortran -g test.f
takk@deb9:~$

warningは取れました。
もしかして、SPLIT関数のプログラムもサイズが違うから動作がおかしいのかもしれません。
文字列のサイズを、10/100混在していたのを100で統一したプログラムです。

takk@deb9:~$ cat split3.f
      PROGRAM MAIN
        CHARACTER*100 STRING
        CHARACTER*100 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('SSIZE1=',I3)
 1200   FORMAT('  SSIZE2=',I3)
 1300   FORMAT('[',A,']')
        STOP
      END

      SUBROUTINE SPLIT(SRC,SEP,DEST,SPLIT_SIZE)
        CHARACTER*100 SRC
        CHARACTER*1 SEP
        CHARACTER*100 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:~$ gfortran split3.f
takk@deb9:~$ ./a.out
 1-3,5,7-12,13,14                                                               
SSIZE1=  5
[1-3                                                                                                 ]
  SSIZE2=  2
[5                                                                                                   ]
  SSIZE2=  1
[7-12                                                                                                ]
  SSIZE2=  2
[13                                                                                                  ]
  SSIZE2=  1
[14                                                                                                  ]
  SSIZE2=  1
takk@deb9:~$

ぴったり数字が合いました。これを使えばcutの-bオプションが作れそうです。

Leave a Reply

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

CAPTCHA