Windows98でCPad for Salford FTN77というソフトを使って、Fortran77のプログラミングをしています。そこで学校での課題で、下のようなプログラムを作ったのですが、実行すると次のようなエラーがでます。
The insrtuction at address 0373f5b0 attempted to read from an illegal location
0373f5b0 routine at address 373F5B0 [+0000]
00401000 main [+074f]
で、ファイルに書き込めてるかどうかチェックすると、何も書き込めていません。どうすれば、ちゃんと動くのでしょうか。どなたか分かる方、宜しくお願いします。
プログラム↓
*生徒50人の成績を読み込み平均点などを計算し、ファイルに書き込む
PROGRAM GOKAMOKU HEIKIN
INTEGER N(1:50),EP(1:50),MP(1:50),JP(1:50),SP(1:50),CP(1:50)
INTEGER SUM(1:50),K,I,L,J,M,Q
REAL PAV(1:50),PVX(1:50),PSD(1:50),EAV,ESD,MAV,MSD,JAV,JSD
REAL SAV,SSD,CAV,CSD
CHARACTER FNAME*30,SHUTURYOKU*20,CN*50,SHUTURYOKU2*20
READ(5,*)FNAME
READ(5,*)SHUTURYOKU
OPEN(1,FILE=FNAME)
DO 10 K=1,50
READ(1,*)N(K),EP(K),MP(K),JP(K),SP(K),CP(K)
10 CONTINUE
CLOSE(1)
*英語の平均点、標準偏差の計算
OPEN(2,FILE=SHUTURYOKU)
CALL AVEETC(EP,EAV,ESD)
WRITE(2,*)'英語の平均点・標準偏差'
WRITE(2,300) EAV,ESD
300 FORMAT(2F6.2)
*数学の平均点、標準偏差の計算
CALL AVEETC(MP,MAV,MSD)
WRITE(2,*)'数学の平均点・標準偏差'
WRITE(2,300) MAV,MSD
*国語の平均点、標準偏差の計算
CALL AVEETC(JP,JAV,JSD)
WRITE(2,*)'国語の平均点・標準偏差'
WRITE(2,300) JAV,JSD
*理科の平均点、標準偏差の計算
CALL AVEETC(SP,SAV,SSD)
WRITE(2,*)'理科の平均点・標準偏差'
WRITE(2,300) SAV,SSD
*社会の平均点、標準偏差の計算
CALL AVEETC(CP,CAV,CSD)
WRITE(2,*)'社会の平均点・標準偏差'
WRITE(2,300) CAV,CSD
*各生徒の合計点、平均点、標準偏差の計算
DO 50 K=1,50
SUM(K)=EP(K)+MP(K)+JP(K)+SP(K)+CP(K)
PVX(K)=EP(K)**2+MP(K)**2+JP(K)**2+SP(K)**2+CP(K)**2
PAV(K)=REAL(SUM(K))/5.0
PSD(K)=SQRT(PVX(K)/5.0-PAV(K)**2)
50 CONTINUE
WRITE(2,*)'各生徒の合計点、平均点、標準偏差'
WRITE(2,*)'番号 合計 平均点 標準偏差'
DO 60 K=1,50
WRITE(2,200)K,SUM(K),PAV(K),PSD(K)
60 CONTINUE
200 FORMAT(I3,I5,2F10.2)
*合計点のヒストグラムを書く
DO 70 J=0,9
JL=10*J
JH=JL+9
CALL STR(SUM(J),CN)
WRITE(2,400)JL,JH,CN
70 CONTINUE
400 FORMAT(1X,I2,'-',I2,'I',A50)
*英語の点数順に並べ変え
DO 20 L=1,49
DO 30 I=L+1,50
IF(EP(L).LT.EP(I)) THEN
M=EP(I)
EP(I)=EP(L)
EP(L)=M
Q=N(I)
N(I)=N(L)
N(L)=Q
END IF
30 CONTINUE
20 CONTINUE
*表示
WRITE(2,*)'英語の成績高い順'
WRITE(2,*)'番号 点数'
DO 40 J=1,50
WRITE(2,100)N(J),EP(J)
40 CONTINUE
100 FORMAT(I2,I3)
END
SUBROUTINE AVEETC(P,AV,SD)
REAL AV,SD
INTEGER P(1:50)
WX=0.0
VX=0.0
DO 10 K=1,50
WX=WX+P(K)
VX=VX+P(K)*P(K)
10 CONTINUE
AV=REAL(WX)/50.0
SD=SQRT(REAL(VX)/50.0-AV**2)
END
SUBROUTINE STR(SUM,C)
INTEGER SUM
CHARACTER C*50
DO 10 K=1,50
IF(K.LE.SUM(K))THEN
C(K:K)='*'
ELSE
C(K:K)=' '
END IF
10 CONTINUE
END
お礼
サブルーチンSORTの引数は(R,T)ではなく(P,N)でした。訂正しておきます。
補足
なるほど。一応修正してみたのですが、今度は、コンパイルに失敗してしまいました。英語の点数の並べ替えをサブルーチンにしてみたのですが、そこがどうもおかしいみたいです。 エラーの文 0010) OPEN(1,FILE=FNAME) WARNING - PRINT * and READ * will be affected by this OPEN statement NO ERRORS,1 WARNINGS [<GOKAMOKUHEIKIN>FTN77 Ver 4.03] NO ERRORS [<AVEETC>FTN77 Ver 4.03] NO ERRORS [<STR>FTN77 Ver 4.03] 0102) INTEGER P(1;50),N(1:50),M,K,L,Q *** Bracket or comma expected 0105) IF(P(K).LT.P(L))THEN *** P is followed by an unexpected "(" *** Invalid IF or ELSEIF statement 0106) M=P(L) *** P is followed by an unexpected "(" 0107) P(L)=P(K) *** P is followed by an unexpected "(" 0108) P(K)=M *** P is followed by an unexpected "(" 0110) N(L)=N(K) *** The left hand side of this assignment is invalid 0111) N(K)=M *** The left hand side of this assignment is invalid 8 ERRORS [<SORT>FTN77 Ver 4.03] *** Compilation failed プログラム(必要な所を抜き出しました) *生徒50人の成績を読み込み平均点などを計算し、ファイルに書き込む PROGRAM GOKAMOKU HEIKIN INTEGER N(1:50),EP(1:50),MP(1:50),JP(1:50),SP(1:50),CP(1:50) INTEGER SUM(1:50),JL,JH,K,J REAL PAV(1:50),PVX(1:50),PSD(1:50),EAV,ESD,MAV,MSD,JAV,JSD REAL SAV,SSD,CAV,CSD CHARACTER FNAME*30,SHUTURYOKU*20,CN*50 READ(5,*)FNAME READ(5,*)SHUTURYOKU OPEN(1,FILE=FNAME) DO 10 K=1,50 READ(1,*)N(K),EP(K),MP(K),JP(K),SP(K),CP(K) 10 CONTINUE CLOSE(1) *合計点のヒストグラムを書く JL=0 JH=0 WRITE(2,*)'各生徒合計点のヒストグラム' DO 70 J=0,4 IF(J.EQ.4)THEN JL=400 JH=500 ELSE JL=100*J JH=JL+99 END IF CALL STR(SUM(J+1),CN) WRITE(2,400)JL,JH,CN 70 CONTINUE 400 FORMAT(1X,I3,'-',I3,'I',A50) *英語の点数順に並べ変え CALL SORT(EP,N) WRITE(2,*)'英語の成績高い順' WRITE(2,*)'番号 点数' DO 40 J=1,50 WRITE(2,100)N(J),EP(J) 40 CONTINUE 100 FORMAT(I2,I3) END SUBROUTINE STR(SUM,C) INTEGER SUM(1:50) CHARACTER C*50 DO 10 K=1,50 IF(SUM(K).LT.K*100)THEN C(K:K)='*' ELSE C(K:K)=' ' END IF 10 CONTINUE END SUBROUTINE SORT(R,T) INTEGER P(1;50),N(1:50),M,K,L,Q DO 10 K=1,49 DO 20 L=K+1,50 IF(P(K).LT.P(L))THEN M=P(L) P(L)=P(K) P(K)=M Q=N(L) N(L)=N(K) N(K)=M END IF 20 CONTINUE 10 CONTINUE END