簡體   English   中英

程序內 SUBROUTINE 聲明中的不可分類語句

[英]Unclassifiable Statement at SUBROUTINE declaration inside a PROGRAM

所以我在 Fortran 90 中編寫了一個基本的 Vigenere Cypher,但是當我嘗試編譯它時,由於我的內部子程序,我遇到了無法分類的語句錯誤。

我已經在'(' ')' 中列出了每個子程序中使用的變量,但我仍然收到錯誤。 我認為這是一個非常簡單的修復,但我似乎無法找到解決方案。

這是我的代碼:

PROGRAM Assign_8

IMPLICIT NONE


CHARACTER*750 :: Input
CHARACTER*10 :: Key
CHARACTER*750 :: RepeatedKey
CHARACTER*750 :: Encrypted, Decrypted
LOGICAL :: Path
CHARACTER*10 :: Validation
INTEGER :: Reps, Encrypt, Decrypt, KeyInt, InputInt, MergeInt, UnmergeInt

WRITE(*,*) 'Do you wish to Encrypt or Decrypt a file?'

CALL Validation_Sub

SUBROUTINE Validation_Sub(Path, Validation)

IMPLICIT NONE

    READ(*,*) Validation

        SELECT CASE (Validation)

            CASE ('Encrypt' , 'encrypt')
                WRITE(*,*) 'You have selected to Encrypt a file.'
                Path = .TRUE.

            CASE ('Decrypt' , 'decrypt')
                WRITE(*,*) 'You have selected to Decrypt a file.'
                Path = .FALSE.

            CASE DEFAULT
                WRITE(*,*) 'Selection not valid please select to either Encrypt or Decrypt a file.'

                IF (Path .EQV. .TRUE.) THEN

                CALL Encrypt_Sub

                ELSE IF (Path .EQV. .FALSE.) THEN   

                CALL Decrypt_Sub

                END IF
            END SELECT
END SUBROUTINE

SUBROUTINE Encrypt_Sub(Input, Key, RepeatedKey, Encrypt, InputInt, KeyInt, MergeInt, Encrypted)

    IMPLICIT NONE

        OPEN(1,FILE='plaintext.txt')
        READ(1,'(A)') Input

        WRITE(*,*) 'Please Enter a Key Phrase of 10 Characters (Including Spaces and Punctuation)'
        READ(*,*) Key
        RepeatedKey = REPEAT(Key(1:10),75)

        DO Encrypt = 1, LEN_TRIM(Input)
            InputInt = IACHAR(Input(Encrypt:Encrypt))
            KeyInt = IACHAR(RepeatedKey(Encrypt:Encrypt))
            MergeInt = InputInt + (KeyInt - 32)

            IF (MergeInt > 126) THEN
                MergeInt = MergeInt - 94
            END IF

            Encrypted(Encrypt:Encrypt) = ACHAR(MergeInt)

        END DO

        OPEN(2,FILE='EncryptionTest.txt')
        WRITE(2,'(A)') Encrypted
        CLOSE(2)

END SUBROUTINE

SUBROUTINE Decrypt_Sub(Encrypted, Key, RepeatedKey, Decrypt, MergeInt, KeyInt, UnmergeInt, Decrypted)

    IMPLICIT NONE

        OPEN(1,FILE='EncryptionTest.txt')
        READ(1,'(A)') Encrypted
        CLOSE(1)

        WRITE(*,*) 'Please Enter Your Key Phrase'
        READ(*,'(A)') Key
        RepeatedKey = REPEAT(Key(1:10),75)

        DO Decrypt = 1, 750, 1
            MergeInt = IACHAR(Encrypted(Decrypt:Decrypt))
            KeyInt = IACHAR(RepeatedKey(Decrypt:Decrypt))
            UnmergeInt = MergeInt - (KeyInt - 32)

            IF (UnmergeInt < 32) THEN
                UnmergeInt = UnmergeInt + 94
            END IF

            Decrypted(Decrypt:Decrypt) = ACHAR(UnmergeInt)

    END DO      

    OPEN(2,FILE='DecryptionTest.txt')
    WRITE(2,'(A)') Decrypted
    CLOSE(2)

END SUBROUTINE

END PROGRAM Assign_8

我得到的具體錯誤是:

SUBROUTINE Validation_Sub(Path, Validation)
1

>Unclassifiable Statement at (1)

(墊片)

IMPLICIT NONE
             1

>Unexpected IMPLICIT NONE statement at (1)

我懷疑 IMPLICIT NONE 錯誤是由於未正確定義 SUBROUTINE 造成的。

END SUBROUTINE
   1

>Expecting END Program statement at (1)

和以前一樣,我懷疑這是因為尚未定義 SUBROUTINE。

這些錯誤會重復出現:

SUBROUTINE Encrypt_Sub

&

SUBROUTINE Decrypt_Sub

如果有人確實在我的 Vigenere Cypher 代碼本身中發現任何直接錯誤,我們將不勝感激,如果您能指出這些錯誤(如果沒有問題的話),我們將不勝感激。

您缺少子例程之前的CONTAINS

在將來的學習模塊中,但現在使用CONTAINS可以使這些子例程正確地位於主程序內部。

所以應該看起來像

PROGRAM Assign_8
  ...

  CALL Validation_Sub

CONTAINS

  SUBROUTINE Validation_Sub(Path, Validation)
  END SUBROUTINE

  ...

END PROGRAM Assign_8

除了頂部缺少“包含”之外,還有其他一些小事情。 您選擇的大小寫應該在默認大小寫之后結束,如果要使用if(Path ..,則超出該大小寫。默認大小寫也應該停止程序。您還沒有關閉一個文件單元。

這是我用$ gfortran -Og -std = f95 -Wall test.f90編譯的代碼

 PROGRAM Assign_8

  IMPLICIT NONE

  LOGICAL :: Path
  CHARACTER(LEN=10) :: Validation
  CHARACTER(LEN=750) :: Input
  CHARACTER(LEN=10) :: Key
  CHARACTER(LEN=750) :: RepeatedKey
  CHARACTER(LEN=750) :: Encrypted, Decrypted
  INTEGER :: Encrypt, Decrypt, KeyInt, InputInt, MergeInt, UnmergeInt

  WRITE(*,*) 'Do you wish to Encrypt or Decrypt a file?'

  CALL Validation_Sub

 CONTAINS

  SUBROUTINE Validation_Sub

    IMPLICIT NONE

    READ(*,*) Validation

    SELECT CASE (Validation)

    CASE ('Encrypt' , 'encrypt')
       WRITE(*,*) 'You have selected to Encrypt a file.'
       Path = .TRUE.

    CASE ('Decrypt' , 'decrypt')
       WRITE(*,*) 'You have selected to Decrypt a file.'
       Path = .FALSE.

    CASE DEFAULT
       WRITE(*,*) 'Selection not valid please select to either Encrypt or Decrypt a file.'
       stop
    end SELECT

    IF (Path .EQV. .TRUE.) THEN

       CALL Encrypt_Sub

    ELSE IF (Path .EQV. .FALSE.) THEN   

       CALL Decrypt_Sub

    END IF

  END SUBROUTINE Validation_Sub

  SUBROUTINE Encrypt_Sub

    IMPLICIT NONE

    OPEN(1,FILE='plaintext.txt')
    READ(1,'(A)') Input
    close(1)

    WRITE(*,*) 'Please Enter a Key Phrase of 10 Characters (Including  Spaces and Punctuation)'
    READ(*,*) Key
    RepeatedKey = REPEAT(Key,75)

    DO Encrypt = 1, LEN_TRIM(Input)
       InputInt = IACHAR(Input(Encrypt:Encrypt))
       KeyInt = IACHAR(RepeatedKey(Encrypt:Encrypt))
       MergeInt = InputInt + (KeyInt - 32)

       IF (MergeInt > 126) THEN
          MergeInt = MergeInt - 94
       END IF

       Encrypted(Encrypt:Encrypt) = ACHAR(MergeInt)

    END DO

    OPEN(2,FILE='EncryptionTest.txt')
    WRITE(2,'(A)') Encrypted
    CLOSE(2)

  END SUBROUTINE Encrypt_Sub

  SUBROUTINE Decrypt_Sub

    IMPLICIT NONE

    OPEN(1,FILE='EncryptionTest.txt')
    READ(1,'(A)') Encrypted
    CLOSE(1)

    WRITE(*,*) 'Please Enter Your Key Phrase'
    READ(*,'(A)') Key
    RepeatedKey = REPEAT(Key,75)

    DO Decrypt = 1, 750, 1
       MergeInt = IACHAR(Encrypted(Decrypt:Decrypt))
       KeyInt = IACHAR(RepeatedKey(Decrypt:Decrypt))
       UnmergeInt = MergeInt - (KeyInt - 32)

       IF (UnmergeInt < 32) THEN
          UnmergeInt = UnmergeInt + 94
       END IF

       Decrypted(Decrypt:Decrypt) = ACHAR(UnmergeInt)

    END DO

    OPEN(2,FILE='DecryptionTest.txt')
    WRITE(2,'(A)') Decrypted
    CLOSE(2)

  END SUBROUTINE Decrypt_Sub

END PROGRAM Assign_8

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM