24小时热门版块排行榜    

查看: 1870  |  回复: 7

songjunann

铜虫 (小有名气)

[求助] 请教一个应用read时出现数组越界的问题,谢谢

程序部分:
  program RDMESH
C
      IMPLICIT   NONE
      INTEGER*4  NUMNP, NUMEL
      integer*4, allocatable :: IEN(:,: ), IN(:,: )
      INTEGER*4  I, IDUM, N, NDUM                     
      REAL*8, allocatable:: X(:, : )
C
      OPEN(21,FILE='mesh.dat')
C
      READ(21,*) NUMNP, NUMEL
      READ(21,*) (IDUM, X(1,I), X(2,I),I=1,NUMNP)
c      
      READ(21,*) (NDUM, (IEN(I, N), I = 1, 4), (IN(I, N), I = 1, 4),
     &        N=1,NUMEL)

      CLOSE(21)
      END


编译通过,但是运行出现错误:forrtl: severe (161): Program Exception - array bounds exceeded,请教一下大家,问题出在哪,谢谢!
附mesh.dat的文件:

      7        5 numnp , numel
    1      0.00000E+00   0.00000E+00   1   node, x , y , ref. num.
    2      0.00000E+00   0.35803E-03   1   node, x , y , ref. num.
    3      0.00000E+00   0.70174E-03   1   node, x , y , ref. num.
    4      0.00000E+00   0.10317E-02   1   node, x , y , ref. num.
    5      0.00000E+00   0.13485E-02   1   node, x , y , ref. num.
    6      0.00000E+00   0.16526E-02   1   node, x , y , ref. num.
    7      0.00000E+00   0.19445E-02   1   node, x , y , ref. num.
    1      1     32     33      2   2   0   0   1   elt , nodes, edges ref. num.
    2      2     33     34      3   0   0   0   1   elt , nodes, edges ref. num.
    3      3     34     35      4   0   0   0   1   elt , nodes, edges ref. num.
    4      4     35     36      5   0   0   0   1   elt , nodes, edges ref. num.
    5      5     36     37      6   0   0   0   1   elt , nodes, edges ref. num.

[ Last edited by songjunann on 2011-11-14 at 13:26 ]
回复此楼
已阅   回复此楼   关注TA 给TA发消息 送TA红花 TA的回帖

maomao1210

金虫 (正式写手)


余泽成(金币+1): 谢谢参与应助! 2011-11-14 23:32:52
楼主和lijunjiexm 一家的吧?
没测试,不过我猜应该是 READ(21,*) (IDUM, X(1,I), X(2,I),I=1,NUMNP)
错误,X是动态数组,你没有分配地址,就用了,貌似应该报溢出错误了。
2楼2011-11-14 15:43:07
已阅   回复此楼   关注TA 给TA发消息 送TA红花 TA的回帖

songjunann

铜虫 (小有名气)

引用回帖:
2楼: Originally posted by maomao1210 at 2011-11-14 15:43:07:
楼主和lijunjiexm 一家的吧?
没测试,不过我猜应该是 READ(21,*) (IDUM, X(1,I), X(2,I),I=1,NUMNP)
错误,X是动态数组,你没有分配地址,就用了,貌似应该报溢出错误了。

不是同一个人。
按您的说法,我在 READ(21,*) NUMNP, NUMEL后面添加了语句
ALLOCATE (X(2,NUMNP),IEN(4,NUMEL),IN(4,NUMEL))
好像运行还会出错:
forrtl: severe<59>: list-directed I/O syntax error, unit 21
3楼2011-11-14 18:55:17
已阅   回复此楼   关注TA 给TA发消息 送TA红花 TA的回帖

maomao1210

金虫 (正式写手)


余泽成(金币+1): 谢谢参与应助! 2011-11-14 23:33:08
引用回帖:
3楼: Originally posted by songjunann at 2011-11-14 18:55:17:
不是同一个人。
按您的说法,我在 READ(21,*) NUMNP, NUMEL后面添加了语句
ALLOCATE (X(2,NUMNP),IEN(4,NUMEL),IN(4,NUMEL))
好像运行还会出错:
forrtl: severe<59>: list-directed I/O syntax erro ...

这是输入文件输入错误,是你文件数据的格式不符合你程序中读入的方式。程序与数据根本都对不上,呵呵。
4楼2011-11-14 20:53:28
已阅   回复此楼   关注TA 给TA发消息 送TA红花 TA的回帖

lijunjiexm

铁虫 (小有名气)


余泽成(金币+1): 鼓励讨论! 2011-11-16 11:17:30
引用回帖:
4楼: Originally posted by maomao1210 at 2011-11-14 20:53:28:
这是输入文件输入错误,是你文件数据的格式不符合你程序中读入的方式。程序与数据根本都对不上,呵呵。

是这样的,第一个命令
READ(21,*) NUMNP, NUMEL
只读取   7   和    5,而后面的字符没读到,
接着第二个read语句
READ(21,*) (IDUM, X(1,I), X(2,I),I=1,NUMNP)
是从文件的第二行开始读取(第一行后面的字符其实没有关系,不影响),
之前我都是用这种方式(do语句)读取一行一行,即使一行没完全读取完整也不会出错,我怀疑是不是implicit do的方式出问题了?implicit do必须完全读取一行??
5楼2011-11-14 23:05:06
已阅   回复此楼   关注TA 给TA发消息 送TA红花 TA的回帖

长歌-废墟

金虫 (小有名气)


余泽成(金币+1): 谢谢参与应助! 2011-11-16 11:17:42
引用回帖:
5楼: Originally posted by lijunjiexm at 2011-11-14 23:05:06:
是这样的,第一个命令
READ(21,*) NUMNP, NUMEL
只读取   7   和    5,而后面的字符没读到,
接着第二个read语句
READ(21,*) (IDUM, X(1,I), X(2,I),I=1,NUMNP)
是从文件的第二行开始读取(第一行后面的 ...

不用,隐式do循环可以只读一半记录,一条记录一行。
6楼2011-11-15 09:44:46
已阅   回复此楼   关注TA 给TA发消息 送TA红花 TA的回帖

长歌-废墟

金虫 (小有名气)


余泽成(金币+1): 谢谢参与应助! 2011-11-16 11:17:50
不过楼主的隐式do循环确实错了,由于您的第二行后面还有字符,虽然不是数字,但是它还是会继续读下去,直到这行数据结束。fortran是使用一次read语句就指针才向下移动一次。如果您用显式do循环,由于循环的作用,其实read语句在每次循环的时候都被使用了一次,您这样写的文件就没问题。但是隐式do循环是只使用一次read语句的,就出错了。
7楼2011-11-15 09:53:40
已阅   回复此楼   关注TA 给TA发消息 送TA红花 TA的回帖

tubrinelee

新虫 (初入文坛)

【答案】应助回帖


jjdg(金币+1): 感谢参与 2011-11-16 01:50:24
songjunann(金币+10): 3Q 2011-11-27 10:50:49
引用回帖:
7楼: Originally posted by 长歌-废墟 at 2011-11-15 09:53:40:
不过楼主的隐式do循环确实错了,由于您的第二行后面还有字符,虽然不是数字,但是它还是会继续读下去,直到这行数据结束。fortran是使用一次read语句就指针才向下移动一次。如果您用显式do循环,由于循环的作用, ...

楼上说得对
要把第二行及以下各行行末的字符串删掉或使用显式do循环
这样就好了

动态数组使用前需要分配大小
8楼2011-11-15 19:31:18
已阅   回复此楼   关注TA 给TA发消息 送TA红花 TA的回帖
相关版块跳转 我要订阅楼主 songjunann 的主题更新
信息提示
请填处理意见