2012-02-28 124 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