2012-02-28 125 views
0

我目前正在使用FORTRAN程序讀取輸入文件。一旦讀取輸入文件,文件的第一行就會包含一個表示文件中矩陣數量的整數。第二行包含每個矩陣有多少行和列。其餘的行都包含矩陣本身。該程序將讀取每個矩陣,並將其寫入輸出文件以及計算所有矩陣的總和。當矩陣數據讀取我不斷收到這兩個錯誤使用讀取語句時出錯

Code: READ(1,*,END=99)(DIMENSIONS(I), I=1,2)

Error: Constants and expressions are invalid in read-only I/O lists.

Error2: This label is undefined [99]

我的代碼是:

*START OF CODE 
    PROGRAM MAIN 

    *DECLARATIONS 
    INTEGER EXISTS, DONE, NUM, DIMENSIONS*2, USED 
    INTEGER I,J, TEMPMAT(10,10), SUM(10,10),OVER 
    CHARACTER INNAME*30, OUTNAME*30 
    *INITIALIZATIONS 
    INNAME='NULL.DOC' 
    EXISTS=0 
    DONE=0 
    I=0 
    J=0 
    OVER=0 
    USED=0 
    NUM=1 
    *FORMATS 
    5  FORMAT(' ','SUM OF 'I2,X,'MATRICIES') 
    *MAIN CODE 
    *DO (0) 

    *DO WHILE(1) INPUT NAME !EXIST AND != QUIT 
    DO WHILE(EXISTS.EQ.0.OR.INNAME.EQ.'QUIT'.OR.INNAME.EQ.'Q') 
    *PROMPT FOR NAME OF FILE AND INPUT 
    PRINT *,'PLEASE INPUT A FILE NAME INCLUDING AN EXTENSION' 
    PRINT *,'ENTER QUIT OR Q TO EXIT' 
    READ (*,*) INNAME 

    *TEST FOR FILE 
    INQUIRE(FILE=INNAME, EXIST=EXISTS) 
    PRINT *, 'INPUT FILE EXSISTS' 
    *IF EXIST=FALSE, DISPLAY MESSAGE 
    IF(.NOT.EXISTS) THEN 
    PRINT *,'FILE DOES NOT EXIST, PLEASE TRY AGAIN' 

    *ELSE EXIST=TRUE, OPEN (UNIT=1) 
    ELSE 
    OPEN(UNIT=1, FILE=INNAME, STATUS='OLD') 
    END IF 
    *END DO(1)  
    END DO 
    *ASK CHOICES FOR OUTPUT 
    PRINT *,'PLEASE ENTER A NAME FOR AN OUTPUT FILE W/ EXTENSION' 
    PRINT *,'ENTER QUIT OR Q TO EXIT' 
    READ(*,*)OUTNAME 

    IF(OUTNAME.EQ.'Q'.OR.OUTNAME.EQ.'QUIT')THEN 
    DONE=1 
    END IF 
    *CHECK IF DONE (IF 1) 
    IF(DONE.EQ.0)THEN 
    *OPEN THE OUTPUT FILE DO(2) 
     DO WHILE(USED.EQ.0) 
      INQUIRE(FILE=OUTNAME,EXIST=EXISTS) 
      PRINT *, 'OUTPUT FILE EXSITS' 
    *OPEN IF FOR IF FILE ALREADY EXISTS 
      IF(EXISTS.EQ.1)THEN 
       DO WHILE(OVER.LT.1.OR.OVER.GT.2) 
       PRINT *,'FILE ALREADY EXISTS. DO YOU WANT TO OVERWRITE?' 
       PRINT *,'SELECT 1 FOR YES OR 2 FOR NO' 
       SELECT CASE(OVER) 
       CASE(1) 
        OPEN(UNIT=2,FILE=OUTNAME,STATUS='OLD') 
        USED=1    
       CASE(2) 
    *DO NOTHING 
       CASE DEFAULT 
        PRINT *, 'THAT WAS NOT EVEN AN VALID INPUT, TRY AGAIN' 
    *END SELECT 
       END SELECT 
    *END IF FOR IF FILE ALREADY EXISTS AMD OPEN IF DID NOT EXIST, END DO(2) 
       END DO 
      END IF 
      OPEN(UNIT=2,FILE=OUTNAME,STATUS='NEW')     
    *READ IN 1 INTEGER (MAXIMUM VALUE OF 10) FOR # OF MATRICIES IN FILE 
      READ(1,*) NUM 
      PRINT *, 'THE NUMBER OF MATRICIES: ', NUM 
    *READ IN 2 INTEGERS, 1=ROWS, 2=COLUMNS MAX OF 10 FOR EACH 
      READ(1,*,END=99)(DIMENSIONS(I), I=1,2) 
    *DO WHILE MORE MATRICIES EXIST DO(3) 
      DO WHILE(NUM.GT.0) 
    *READ THE MATRIX IN DO(4) 
       DO J=1,DIMENSIONS(1) 
        READ(1,*,END=99)(TEMPMAT(J,I),I=1,DIMENSIONS(2)) 
    *END DO (4) 
       END DO 
    *ADD MATRIX TO SUM MATRIX 
    *DO(5)(6) 
       DO J=1,10 
        DO I=1,10 
         SUM(J,I)=SUM(J,I)+TEMPMAT(J,I) 
    *END DO(5)(6) 
        END DO 
       END DO 
    *PRINT CURRENT MATRIX TO FILE W/ HEADER 'MATRIX X' 
    *DO(6) 
       DO J=1,DIMENSIONS(1) 
        WRITE(2,*)(TEMPMAT(J,I),I=1,DIMENSIONS(2)) 
    *END DO(6) 
       END DO 
    *WRITE HEADING 'SUM OF ALL N MATRICES' 
       WRITE(2,*)5,NUM 
       NUM=NUM-1 
    *END DO(3) 
      END DO 
    *END DO(0) 
    END DO 
    *PRINT SUM OF MATRICES 
    *DO(7) 
    DO J=1,10 
    WRITE(2,*)(SUM(J,I),I=1,10) 
    *END DO(7) 
    END DO 
    END IF 
    *STOP 
    STOP 
    *END 
    END 

回答

1

尺寸被以一種特殊的方式宣佈。嘗試尺寸(2)。也許這與它有關,因爲帶有錯誤消息的行是第一個使用尺寸的。

+0

這是一個簡單的修復和工作。謝謝。第一次它終於編譯。現在我只需要解析我的語法,因爲我現在正在接收堆棧轉儲 – dtturner12 2012-02-28 04:52:41

+0

嘗試使用編譯器的選項編譯來執行運行時下標檢查。這可能會捕獲堆棧轉儲的原因。你使用什麼編譯器? – 2012-02-28 05:49:28

1

嗯,我覺得它想要去排隊「99」上EOF。

而你還沒有定義99行,對嗎?

建議:嘗試排成一行「99 CONTINUE」。

這個鏈接也可能有助於:

+0

我想要發生的是它停止讀取99個字符後的當前行 – dtturner12 2012-02-28 04:27:19

+0

我已嘗試省略END,但仍然收到常量和表達式無效的錯誤 – dtturner12 2012-02-28 04:28:27

+1

如果您只想讀取至多99每行字符數,讀入長度爲99的字符串,然後從該字符串中讀取數字。這將比從文件中讀取數字更加複雜,特別是如果允許每行數字的數量發生變化。 – 2012-02-28 04:36:04