コードの改修 -- ファイルのオープン(一部修正) ― 2017年08月10日 17:07
WATCOM fortran 77版Ratforプリプロセッサが、動き出しましたので、 実際に、Ratforで書かれたツールの動作テストを行っています。やはり、例外なく、 プログラムのミスで不具合が出ていますので、これを修正しながら、Ratfor版の ツールの完成を目指しています。
基本的なファイル操作fopen()に不具合がありましたので、改修したコードを 掲載します。
改修したRatfor版のfopen()は以下の通りです。
# fopen.r4 -- connect internal file despter and external file include ratfor.mac integer function fopen(uid,fn,act) integer act,uid character fn(ARB) [character]*MAXLINE cfn include files call is2cs(fn,cfn,MAXLINE) for (uid = 1; uid <= MAXFILES; uid = uid + 1) if (finuse(uid) == NOUSE) { if (act == READ) { open(unit=uid,file=cfn,action='[READ]',status='[OLD]',err=99) uid = uid finuse(uid) = INUSE flastcr(uid) = MAXLINE fbuf(uid,MAXLINE) = NEWLINE fnew(uid) = NO fmode(uid) = act } else if (act == WRITE) { open(unit=uid,file=cfn,action='[WRITE]',status='[UNKNOWN]',err=99) uid = uid finuse(uid) = INUSE flastcw(uid) = 0 fmode(uid) = act } else if (act == READWRITE) { open(unit=uid,file=cfn,action='[READWRITE]',status='[OLD]',err=99) uid = uid finuse(uid) = INUSE flastcr(uid) = MAXLINE flastcw(uid) = 0 fbuf(uid,MAXLINE) = NEWLINE fnew(uid) = NO fmode(uid) = act } else { # error uid = ERR fopen = ERR return } fopen = uid return } 99 continue uid = ERR fopen = ERR return end
WATCOM fotran77版のfopen()は以下の通りです。
c fopen.f -- connect internal file descripter and external file include ratfor.def integer function fopen(uid,fname,act) integer uid integer*1 act,fname(ARB) character*MAXLINE cfn include files.fi call is2cs(fname,cfn,MAXLINE) uid = 1 while (uid .le. MAXFILES) do if (finuse(uid) .eq. NOUSE) then if (act .eq. READ) then open(unit=uid,file=cfn,action='READ', 1 status='OLD',err=99) fopen = uid finuse(uid) = INUSE flastcr(uid) = MAXLINE fbuf(uid,MAXLINE) = NEWLINE fnew(uid) = NO fmode(uid) = act else if (act .eq. WRITE) then open(unit=uid,file=cfn,action='WRITE', 1 status='UNKNOWN',err=99) fopen = uid finuse(uid) = INUSE flastcw(uid) = 0 fmode(uid) = act else if (act .eq. READWRITE) then open(unit=uid,file=cfn,action='READWRITE', 1 status='OLD',err=99) fopen = uid finuse(uid) = INUSE flastcr(uid) = MAXLINE flastcw(uid) = 0 fbuf(uid,MAXLINE) = NEWLINE fnew(uid) = NO fmode(uid) = act else ! error uid = ERR fopen = uid end if return endif uid = uid + 1 end while 99 continue uid = ERR fopen = ERR return end
これ以外にも、単純なタイプミスも含めて、多くの修正点があります。 近くに、まとめてご紹介できるよう考えています。
最近のコメント