Fortran77のプログラム実行時にエラー
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
お礼
4や6のループは不要というのでわかりました。 私はk=i-(i/2)*2を使って、2以外の偶数を省くというやり方でやりました。 そしたら13秒とかなり早くなりました。 ありがとうございました。