Errore utilizzando un'istruzione di lettura
-
13-11-2019 - |
Domanda
Attualmente sto lavorando a un programma Fortran che è quello di leggere un file di input. Una volta letto il file di input, la prima riga del file contiene un numero intero che rappresenta la quantità di matrici nel file. La seconda riga contiene quante righe e colonne ogni matrice. Il resto delle linee contiene le matrici stesse. Il programma leggerà in ogni matrice e la scriverà in un file di output e calcolerà la somma di tutte le matrici. Quando leggo i dati della matrice continuo a ricevere questi due errori
Codice: leggi (1,*, end = 99) (dimensioni (i), i = 1,2)
Errore: le costanti ed espressioni non sono valide negli elenchi di I/O di sola lettura.
Errore2: questa etichetta non è definita [99
Il mio codice è:
*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
Soluzione
Le dimensioni sono dichiarate in modo peculiare. Prova le dimensioni (2). Forse questo ha qualcosa a che fare con esso poiché la riga con il messaggio di errore è la prima a usare le dimensioni.
Altri suggerimenti
Uh, penso che voglia andare in linea "99" su EOF.
E non hai ancora definito una riga 99, vero?
Suggerimento: prova a mettere in una linea "99 Continua".
Questo link potrebbe anche aiutare: