爱气象,爱气象家园! 

气象家园

 找回密码
 立即注册

QQ登录

只需一步,快速开始

新浪微博登陆

只需一步, 快速开始

搜索
查看: 6737|回复: 14

[求助] Fortran读取数组的一些问题

[复制链接]

新浪微博达人勋

发表于 2018-2-1 20:46:30 | 显示全部楼层 |阅读模式

登录后查看更多精彩内容~

您需要 登录 才可以下载或查看,没有帐号?立即注册 新浪微博登陆

x
有一个自动站的数据现实(m行31列),用二维数组整个读取,用一个显式循环j=1,m和隐式循环 aws(i,j),i=1,31可以读取出来。
但是如果都是显式循环时候 j=1,m和i=1,31时候就会报错,提示为end of file during read。
不是很明白为什么两个显式循环就会出错,求助各位解答一下啦 谢谢。

图1

图1



图2

图2


错误提示

错误提示



密码修改失败请联系微信:mofangbao

新浪微博达人勋

发表于 2018-2-1 21:38:16 | 显示全部楼层
这个是read 读取规则影响的,一次read只对应一行数据。
http://bbs.06climate.com/forum.p ... p;extra=&page=1
密码修改失败请联系微信:mofangbao

新浪微博达人勋

发表于 2018-2-2 07:57:04 | 显示全部楼层
数组在内存中是“一条线” 排列的, 内存中没有行和列的概念。如果不把二维数组写出来的话,二维数组也没有统一的行列概念。 a( i, j ) 可以把 i 叫做行,j 叫做列,也可以把 i 叫做列,j 叫做行。
但是 为了方便,大家习惯上,把前面的维度叫做列(也就是你的aws数组里面的 i),后面的维度叫做行(aws数组的 j)。由于Fortran 命名时先改变前面的维度,因此,大家习惯称之为“列优先”

-------------上面这段是从这个网址看到的http://fcode.cn/guide-45-1.html

所以,是不是可以这样理解,先读第一列的每一行,然后再读第二列的每一行,这样循环下去
如果一定要用两个显示循环是不是应该这样写
Do i = 1, 31
     Do j = 1,m
            read (10,*) aws(i,j)
     End do
End do

最近刚刚学习Fortran,所有的知识储备都是网上零散的查到的,不知道自己理解的对不对,走过路过的大神给指点指点~~~
密码修改失败请联系微信:mofangbao

新浪微博达人勋

 楼主| 发表于 2018-2-2 10:31:31 | 显示全部楼层
乌兰兰111 发表于 2018-2-2 07:57
数组在内存中是“一条线” 排列的, 内存中没有行和列的概念。如果不把二维数组写出来的话,二维数组也没有 ...

尝试了 还是同样报错。。
密码修改失败请联系微信:mofangbao

新浪微博达人勋

 楼主| 发表于 2018-2-2 10:34:45 | 显示全部楼层
river 发表于 2018-2-1 21:38
这个是read 读取规则影响的,一次read只对应一行数据。
http://bbs.06climate.com/forum.php?mod=viewthre ...

好的 谢谢啦
密码修改失败请联系微信:mofangbao

新浪微博达人勋

发表于 2018-2-2 11:20:46 | 显示全部楼层
Gabriella 发表于 2018-2-2 10:31
尝试了 还是同样报错。。

应该是 aws (i,j) 这里写错了,但是我现在也不知道应该写成 aws (i,:)  还是 aws (;,j )   有点晕,你两个都试一下看看
密码修改失败请联系微信:mofangbao

新浪微博达人勋

 楼主| 发表于 2018-2-2 13:45:54 | 显示全部楼层
乌兰兰111 发表于 2018-2-2 11:20
应该是 aws (i,j) 这里写错了,但是我现在也不知道应该写成 aws (i,:)  还是 aws (;,j )   有点晕,你 ...

好的 谢谢啦~
密码修改失败请联系微信:mofangbao

新浪微博达人勋

发表于 2018-2-2 16:55:46 | 显示全部楼层
乌兰兰111 发表于 2018-2-2 11:20
应该是 aws (i,j) 这里写错了,但是我现在也不知道应该写成 aws (i,:)  还是 aws (;,j )   有点晕,你 ...

不管怎么改应该都是行不通的,这里的问题不在于循环是显式还是隐式。因为这个不是对于数组的操作,而是文件读写的操作。
楼主的问题其实二楼river非常简明的回答了,第一种写法认为文件有m条记录,第二种认为是m*31条记录。那么对于一个只有m条记录的文件,肯定只能循环m次读取。内存虽然没有行列和记录的概念,但是文件还是有的。
密码修改失败请联系微信:mofangbao

新浪微博达人勋

发表于 2018-2-2 16:59:21 | 显示全部楼层
乌兰兰111 发表于 2018-2-2 11:20
应该是 aws (i,j) 这里写错了,但是我现在也不知道应该写成 aws (i,:)  还是 aws (;,j )   有点晕,你 ...

如果这里对应的是无格式文件,那么循环也应该是按照楼主原本的写法,m在外层、31在内层。
密码修改失败请联系微信:mofangbao

新浪微博达人勋

发表于 2018-2-2 17:56:06 | 显示全部楼层
lqouc 发表于 2018-2-2 16:55
不管怎么改应该都是行不通的,这里的问题不在于循环是显式还是隐式。因为这个不是对于数组的操作,而是文 ...

嗯嗯,明白了,谢谢你帮我解答~~
密码修改失败请联系微信:mofangbao
您需要登录后才可以回帖 登录 | 立即注册 新浪微博登陆

本版积分规则

Copyright ©2011-2014 bbs.06climate.com All Rights Reserved.  Powered by Discuz! (京ICP-10201084)

本站信息均由会员发表,不代表气象家园立场,禁止在本站发表与国家法律相抵触言论

快速回复 返回顶部 返回列表