Fortran Coder

查看: 19185|回复: 7
打印 上一主题 下一主题

[数值问题] 关于数组越界的问题

[复制链接]

26

帖子

8

主题

0

精华

熟手

F 币
123 元
贡献
78 点
跳转到指定楼层
楼主
发表于 2015-5-26 13:24:53 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
关于程序编译的时候会出现数组越界的报错,不知道该怎么解决,求助一下,请大神帮忙解答一下呗?
[Fortran] 纯文本查看 复制代码
01program dla
02implicit none
03parameter M=100
04parameter N=100
05parameter Particles=2000
06integer::A(M,N)
07integer::i, j, count, p
08real*8::s,num1,num2,num3
09open(13,file="dla.txt")   
10do i=1,M    
11 do j=1,N       
12A(i,j)=0     
13end do   
14end do   
15A(50,50)=1
16count=0
17do while (cout<Particles)
18count=count+1
19write(*,*)'Current Particles is',count  
20 call random_number(num1)  
21 i=1+int(num1*(N-1))   
22call random_number(num2)  
23 j=1+int(num2*(N-1))  
24 p=0
2555 do while(p==0)  
26call random_number(num3)   
27s=num3       
28if(s<=0.25) then           
29  j=j+1        
30 else if(s<=0.50) then           
31  j=j-1            
32 else if(s<=0.75) then            
33 i=i+1           
34  else            
35 i=i-1      
36 endif                  
37   if (j==N+1) then          
38   j=1      
39 goto 55       
40endif                 
41    if (j==0) then          
42   j=N      
43 goto 55       
44endif     
45  if (i==M+1) then          
46   i=1     
47  goto 55      
48 endif     
49  if (i==0) then           
50  i=M      
51 goto 55     
52  endif     
53  if(A(i,j-1)==1.OR.A(i,j+1)==1.OR.A(i+1,j)==1.OR.A(i-1,j)==1) then         
54    A(i,j)=1     
55   write(30,*) i, j          
56      p=10          
57     endif       
58  enddo     
59 enddo       
60    end program dla
分享到:  微信微信
收藏收藏 点赞点赞 点踩点踩

2038

帖子

12

主题

5

精华

论坛跑堂

臭石头雪球

F 币
1676 元
贡献
715 点

美女勋章热心勋章星光勋章新人勋章贡献勋章管理勋章帅哥勋章爱心勋章规矩勋章元老勋章水王勋章

沙发
发表于 2015-5-26 14:32:49 | 只看该作者
在我这里运行没有问题啊,也没有越界。

问题1:
do while (cout<Particles)
应该是
do while (count<Particles)

问题2:
打开文件通道号是 13,输出文件通道号是30

修改后,部分输出结果为:
           8         100
          50          49
           8          99
           8          98
           9          98
          51          49
           7          99
          50          48
           9          99
          51          50
          49          48
          48          48
          50          47
          52          49
          48          49
          53          49
          48          47
          52          50
          10          98
          10          97
          11          97
          10          96
          52          48
           6          99

26

帖子

8

主题

0

精华

熟手

F 币
123 元
贡献
78 点
板凳
 楼主| 发表于 2015-5-26 15:14:19 | 只看该作者
fcode 发表于 2015-5-26 14:32
在我这里运行没有问题啊,也没有越界。

问题1:

改正完之后会报错。。。。我用的是Intel 的编译器

2038

帖子

12

主题

5

精华

论坛跑堂

臭石头雪球

F 币
1676 元
贡献
715 点

美女勋章热心勋章星光勋章新人勋章贡献勋章管理勋章帅哥勋章爱心勋章规矩勋章元老勋章水王勋章

地板
发表于 2015-5-26 17:28:21 | 只看该作者
关于报错呢,一定要给错误提示的。

只说报错,神仙都不知道为啥。

26

帖子

8

主题

0

精华

熟手

F 币
123 元
贡献
78 点
5#
 楼主| 发表于 2015-5-26 22:08:04 | 只看该作者
fcode 发表于 2015-5-26 17:28
关于报错呢,一定要给错误提示的。

只说报错,神仙都不知道为啥。

#1 of the array A has value 0 which is less than the lower bound of 1

2038

帖子

12

主题

5

精华

论坛跑堂

臭石头雪球

F 币
1676 元
贡献
715 点

美女勋章热心勋章星光勋章新人勋章贡献勋章管理勋章帅哥勋章爱心勋章规矩勋章元老勋章水王勋章

6#
发表于 2015-5-27 08:31:50 | 只看该作者
if(A(i,j-1)==1.OR.A(i,j+1)==1.OR.A(i+1,j)==1.OR.A(i-1,j)==1) then      

这里你要考虑 i = 1 或 j = 1 的情况。以及 i = 100 或 j = 100 的情况。

26

帖子

8

主题

0

精华

熟手

F 币
123 元
贡献
78 点
7#
 楼主| 发表于 2015-5-27 12:50:37 | 只看该作者
fcode 发表于 2015-5-27 08:31
if(A(i,j-1)==1.OR.A(i,j+1)==1.OR.A(i+1,j)==1.OR.A(i-1,j)==1) then      

这里你要考虑 i = 1 或 j = 1 ...

恩,我也觉得应该是这里的问题。。那么是需要怎么改写的呢??

955

帖子

0

主题

0

精华

大师

F 币
188 元
贡献
77 点

规矩勋章元老勋章新人勋章水王勋章热心勋章

QQ
8#
发表于 2015-5-27 13:05:37 | 只看该作者
那要看你是怎么打算处理边界的问题咯。

是在这个方向的边界上,就不再判断该边界,还是其他处理方式?
您需要登录后才可以回帖 登录 | 极速注册

本版积分规则

捐赠本站|Archiver|关于我们 About Us|小黑屋|Fcode ( 京ICP备18005632-2号 )

GMT+8, 2025-4-28 13:41

Powered by Discuz! X3.4

© 2013-2025 Comsenz Inc.

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