Fortran Coder

标题: 大家帮我看条隐循环语句 [打印本页]

作者: qs2017    时间: 2017-11-16 11:23
标题: 大家帮我看条隐循环语句
WRITE(NLB,REC=1) LREC,(-1,I=1,LREC-1)
其中NLB是指一个二进制文件,里面包含的隐do循环是什么啊?

作者: pasuka    时间: 2017-11-16 12:00
参考中科的网上教程
http://micro.ustc.edu.cn/Fortran/ZJDing/Sec3-1.htm#第3_1_2f
d)    隐DO循环

隐DO循环实际上是带控制循环变量的DO循环,但简化成只有DO循环的第一句,且把关键字DO隐去,成为I=m1,m2,m3形式。它不是独立语句,只是用作为读写语句的输入输出表中一个组成部分,用来控制重复读写的次数。例如:
READ *,(VALUE(I),I=1,20)
表示读入VALUE(1),VALUE(2),…,VALUE(20)的值。
WRITE(*,*)(A,B,N=1,5)
表示在当前设备用默认格式重复输出A、B的值5次。
隐DO循环只能作为输入输出表的一部分出现,不能用于其它场合。此时输入输出表的一般形式为:(I/O列表,循环变量名=初值,终值,增值)。也即把输入输出表与循环控制部分一起用括号括起,中间用逗号分开,称为隐DO表,写在读写语句后面作为读写对象。
隐DO表可以嵌套,如:
PRINT *, ((A(I,J),I=1,3),J=1,3)
先把内层(A(I,J),I=1,3)隐DO表作为输出表,再与隐DO控制J=1,3合成外层隐DO表。其控制机制与嵌套DO循环一致,先内层循环完,外层循环变量加一步长,再循环完内层。其打印值的次序如下:
A(1,1),A(2,1),A(3,1),A(1,2),A(2,2),…,A(3,3)
即先输出第1列,再输出第2列、第3列。如果把J作为内层,I作为外层循环变量,则输出是按行的:
PRINT *,((A(I,J),J=1,3),I=1,3)
则打印输出值的次序为:
A(1,1),A(1,2),A(1,3),A(2,1),A(2,2),…,A(3,3)

作者: qs2017    时间: 2017-11-16 12:11
pasuka 发表于 2017-11-16 12:00
参考中科的网上教程
http://micro.ustc.edu.cn/Fortran/ZJDing/Sec3-1.htm#第3_1_2f

您好,我的这条语句一直出错,您能帮我看一下吗
OPEN(NASC,FILE=ASCLIB,STATUS='UNKNOWN',ACCESS='DIRECT'
                      FORM='FORMATTED',RECL=LRFC*LREC)
WRITE(NASC,REC=1) LREC,(-1,LREC=-1)
NASC是文件号,LRFC和LREC都是之前定义好的数
作者: vvt    时间: 2017-11-16 12:14
本帖最后由 vvt 于 2017-11-16 12:20 编辑

你在主楼写的是
WRITE(NLB,REC=1) LREC,(-1,I=1,LREC-1)
上一楼你写的是
WRITE(NASC,REC=1) LREC,(-1,LREC=-1)
其中第二种写法是非法的。

第一种
WRITE(NLB,REC=1) LREC,(-1,I=1,LREC-1)
的意思是
先写入 LREC,然后写入  LREC-1 个 -1。

直观一点,假如 LREC = 6
那么相当于
WRITE(NLB,REC=1) LREC,-1,-1,-1,-1,-1
作者: qs2017    时间: 2017-11-16 12:20
vvt 发表于 2017-11-16 12:14
你在主楼写的是
WRITE(NLB,REC=1) LREC,(-1,I=1,LREC-1)
上一楼你写的是

那么第二种应该怎么改啊才行啊
作者: vvt    时间: 2017-11-16 12:21
第二个看你要做什么了。
作者: qs2017    时间: 2017-11-16 12:21
vvt 发表于 2017-11-16 12:14
你在主楼写的是
WRITE(NLB,REC=1) LREC,(-1,I=1,LREC-1)
上一楼你写的是

第一种写法我现在可以理解,第一种写法文件是个二进制文件,我想自己打开一个文本文件然后有同样的效果
作者: qs2017    时间: 2017-11-16 12:23
vvt 发表于 2017-11-16 12:21
第二个看你要做什么了。

我就想达到和第一种一样的效果,往文件里写入一样的东西
作者: vvt    时间: 2017-11-16 12:24
那把第一句复制一下,粘贴一下就可以了。
作者: vvt    时间: 2017-11-16 12:25
qs2017 发表于 2017-11-16 12:21
第一种写法我现在可以理解,第一种写法文件是个二进制文件,我想自己打开一个文本文件然后有同样的效果 ...

写入文本文件的话,这样写
WRITE(NLB,*) LREC,(-1,I=1,LREC-1)
作者: qs2017    时间: 2017-11-16 12:28
vvt 发表于 2017-11-16 12:25
写入文本文件的话,这样写
WRITE(NLB,*) LREC,(-1,I=1,LREC-1)

您是说我文本文件NASC写成
WRITE(NASC,*) LREC,(-1,I=1,LREC-1)吗?
我刚试过这个还是断了啊
作者: vvt    时间: 2017-11-16 12:35
是的。这样写。
程序断了有很多种可能。仅仅根据一句代码没法知道原因。

程序是需要前后对应的,所有语句单独都是正确的,组合起来还是可能有问题。
作者: qs2017    时间: 2017-11-16 12:39
vvt 发表于 2017-11-16 12:35
是的。这样写。
程序断了有很多种可能。仅仅根据一句代码没法知道原因。

嗯我明白您的意思,只不过这几条语句感觉只关于文件打开和写入语句啊。中间例如LREC这种值也没变过
作者: vvt    时间: 2017-11-16 12:43
仅仅从你给出的代码来看,是的。
作者: pasuka    时间: 2017-11-16 13:00
本帖最后由 pasuka 于 2017-11-16 13:03 编辑

还是同一个网上教程
http://micro.ustc.edu.cn/Fortran/ZJDing/Sec7-2.htm#第7_2_3e
存放在直接访问文件中的记录可以以任意顺序进行读写操作。文件中的记录从1开始连续编号,记录的长度是通过OPEN语句中的RECL选项来描述的。直接文件中的记录是通过指定要访问的记录号来实现的。因此,如果想要实现数据的随机访问可以使用直接访问文件。直接文件应用的一个最常见的实例就是数据库。在程序中可以用带有ACCESS=’DIRECT’设置项的OPEN语句来打开或建立直接文件。
直接文件中的每个记录的长度必须相等。如果实际输出的记录长度不等,则应取输出的所有记录中最大的长度作为每个记录的长度。如果使用一个老文件,在OPEN语句中说明的记录的长度必须与实际的记录长度一致。特别要注意尾随的空格符,它占一个字节。回车换行符不计入记录长度。用直接方式建立的文件可以使用顺序方式打开进行读操作。用顺序方式建立的文件,只要记录长度相等,也可以用直接方式打开进行读操作。
b)    格式化直接文件

在格式化直接文件中,所有记录的长度都相同并且可以以任意顺序读写。记录的长度由OPEN语句中的RECL=选项指定,该长度应该大于或等于最长的记录中的字节数。CR和LF是分隔符,不包括在RECL中。一旦某个直接访问记录被写入就不能再删除它,但可以覆盖这个记录。在输出到一个格式化直接文件时如果数据没有占满一个记录,则编译系统将在剩下的位置上补以空格,保证文件只包含长度相同的完整的记录。从文件中读数据时,当I/O列表或格式描述符中要读取的数据多于记录中的数据时,编译器也会以空格填充未读数据的变量。可以通过在打开文件的OPEN语句中设置PAD=NO来避免填补空格,此时输入记录必须有和输入列表和格式描述符所要求的一样多的数据,否则会产生错误。PAD=NO对输出没有影响。
例:OPEN(3,FILE=’FDIR’,FORM=’FORMATTED’,ACCESS=’DIRECT’,RECL=10)
WRITE(3,’(A10)’,REC=1) ’RECORD ONE’
WRITE(3,’(I5)’,REC=3) 30303
CLOSE(3)
END


作者: qs2017    时间: 2017-11-16 21:53
本帖最后由 qs2017 于 2017-11-16 21:55 编辑

嗯。。。。。

作者: qs2017    时间: 2017-11-17 11:05
pasuka 发表于 2017-11-16 13:00
还是同一个网上教程
http://micro.ustc.edu.cn/Fortran/ZJDing/Sec7-2.htm#第7_2_3e

我看了您给的文档可还是有很多问题不太了解,您方便交流下吗




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