Fortran Coder

标题: 内部文件使用报错Fortran runtime error: End of record [打印本页]

作者: xk6891    时间: 2024-7-19 16:58
标题: 内部文件使用报错Fortran runtime error: End of record
本帖最后由 xk6891 于 2024-7-19 17:00 编辑

[Fortran] 纯文本查看 复制代码
program main
implicit none
integer charnum
character,allocatable::smi(:)
!!character(len=30)::smi
character(len=1)sinelem
character(len=2)douelem
charnum=30
allocate(smi(charnum))
smi=''
sinelem="A"
douelem="BB"

write(smi(1:1),"(A1)")sinelem
write(*,*)smi
write(smi(2:3),"(A2)")douelem
write(*,*)smi

end

出现报错
[Fortran] 纯文本查看 复制代码
 A
At line 16 of file test.f90
Fortran runtime error: End of record

Error termination. Backtrace:

单个字母是可以输入到内部文件的,多个字母就会出现这个错误。
看到有的帖子说是由于动态长度字符串的原因,因此把动态长度的字符串屏蔽掉,采用固定长度的字符串,是正常输出的
[Fortran] 纯文本查看 复制代码
program main
implicit none
integer charnum
!!character,allocatable::smi(:)
character(len=30)::smi
character(len=1)sinelem
character(len=2)douelem
charnum=30
!!allocate(smi(charnum))
smi=''
sinelem="A"
douelem="BB"

write(smi(1:1),"(A1)")sinelem
write(*,*)smi
write(smi(2:3),"(A2)")douelem
write(*,*)smi

end

输出如下
[Fortran] 纯文本查看 复制代码
 A
ABB

问题出在哪里?
既然动态长度字符串的内部文件能够输入单个字母,应该不是动态长度与固定长度的问题吧?但也无更好解释



作者: fcode    时间: 2024-7-19 21:26
character,allocatable::smi(:)
这是一个字符数组,注意是数组。
所以 smi(2:3) 也是一个数组,有2个元素,每个元素长度都是1。

character(len=30)::smi
这是一个字符串(单变量)。
所以 smi(2:3) 是一个子字符串,单变量,长度为 2。


你可以用“递延长度字符串”来代替“可分配字符数组
[Fortran] 纯文本查看 复制代码
character(len=:) , allocatable :: smi
allocate( character(len=30)::smi )
deallocate(smi)
详解 http://diyanzifuchuan.w.fcode.cn/


作者: xk6891    时间: 2024-7-19 22:35
fcode 发表于 2024-7-19 21:26
character,allocatable::smi(:)
这是一个字符数组,注意是数组。
所以 smi(2:3) 也是一个数组,有2个元素, ...

啊啊啊,对了,这是数组不是字符串。感谢大佬提醒,谢谢




欢迎光临 Fortran Coder (http://bbs.fcode.cn/) Powered by Discuz! X3.2