【发布时间】:2018-08-06 14:20:03
【问题描述】:
我正在尝试在 Fortran 中执行以下操作:
- 逐行读取文本文档
- 通过“交换”每个字母来逐字编码每一行 在字母表中出现在它后面 l 位的那个,l= 的长度 词
- 将编码的行写入新的输出文档
我的循环似乎无限期地运行,并且没有任何文字被写入输出文档
我的测试输入文档只有 2 行:
- 一些东西
- 还有一些东西
第一行被正确读取和编码
PROGRAM zeichen
USE PufferMod
IMPLICIT NONE
CHARACTER(LEN=132) :: z
CHARACTER(maxlen):: x
INTEGER:: a,e,i,l
OPEN(UNIT=39,FILE="intext.txt",ACTION="READ", STATUS="OLD")
OPEN(UNIT=40, FILE="outext.txt", ACTION="WRITE")
DO
2 READ(39,"(A)", end=10) z
a=1;
DO WHILE(a<133)
WRITE(*,*) z
WRITE(*,*) a
CALL Suche_Wort(z,a,e)
l=e-a+1
WRITE(*,*) a,e,l
DO i=a,e
IF(z(i:i)/="") THEN
CALL Codiere(z(i:i),l)
END IF
END DO
a=e+1
END DO
WRITE(40,*) z
END DO
10 CLOSE(UNIT=39)
CLOSE(UNIT=40)
END PROGRAM zeichen
MODULE PufferMod
IMPLICIT NONE
PRIVATE
PUBLIC :: maxlen, Codiere, Suche_Wort
INTEGER, PARAMETER :: maxlen = 132
CONTAINS
FUNCTION Kleinbuchstabe(z)
CHARACTER(LEN=1) :: z
LOGICAL :: Kleinbuchstabe
Kleinbuchstabe= "a" <= z .AND. z <= "z"
END FUNCTION Kleinbuchstabe
FUNCTION Grossbuchstabe(z)
CHARACTER(LEN=1) :: z
LOGICAL :: Grossbuchstabe
Grossbuchstabe= "A" <= z .AND. z <= "Z"
END FUNCTION Grossbuchstabe
FUNCTION Buchstabe(z)
CHARACTER(LEN=1) :: z
LOGICAL :: Buchstabe
Buchstabe= (("a" <= z .AND. z <= "z") .OR. ("A" <= z .AND. z <= "Z"))
END FUNCTION Buchstabe
SUBROUTINE Codiere(z, Verschiebung)
CHARACTER(LEN=1) :: z
INTEGER, INTENT(IN) :: Verschiebung
INTEGER :: CodevonA
IF ( Kleinbuchstabe(z) ) THEN
CodevonA= ICHAR("a")
ELSE IF ( Grossbuchstabe(z) ) THEN
CodevonA= ICHAR("A")
END IF
z= CHAR( CodevonA + MOD( ICHAR(z) - CodevonA + Verschiebung, 26 ) )
END SUBROUTINE Codiere
SUBROUTINE Suche_Wort(z,a,e)
CHARACTER(LEN=maxlen), INTENT(in):: z
INTEGER, INTENT(inout):: a
INTEGER, INTENT(out):: e
CHARACTER:: x, temp*1
INTEGER:: i
i=1
temp=z(a:a)
!WRITE(*,*) "a before loop",a, "temp", temp
DO WHILE(temp == " ") !Find start of next word
temp=z(a+i:a+i)
i=i+1
a=a+1
END DO
!WRITE(*,*) "a after loop", a
e=a+1
i=1
temp=z(e:e)
DO WHILE(temp/= "") !find where the word ends by finding a space
temp=z(e+i:e+i)
i=i+1
e=e+1
IF(temp == " ") EXIT
END DO
END SUBROUTINE Suche_Wort
END MODULE PufferMod
【问题讨论】:
-
我以为读完最后一行就结束了;当输入文档结束时。
-
10是输入文档读完后要去的地方。
-
当我运行你的代码时,我遇到了分段错误,当代码离开
z的末尾时。尝试在打开错误边界检查的情况下重新编译,然后再试一次。 -
我该怎么做?
-
您查阅编译器文档,搜索短语array bounds 或bounds check。或者在 SO 上查看其他问题,该主题大约每周讨论一次。