主题:求教:这个程序怎么越界的?
sinan
[专家分:0] 发布于 2010-09-11 10:49:00
PROGRAM Main
IMPLICIT NONE
INTEGER i,j,k
INTEGER,ALLOCATABLE::A(:)
INTEGER::C(20)=(/1,2,3,4,5,6,7,8,9,10,3,7,9,2,3,8,5,1,2,3/)
k=1
DO i=1,20,4
DO j=1,20
IF(C(j)==C(i))THEN
A(k)=j
k=k+1
ELSE
END IF
END DO
WRITE(*,*)A(:)
END DO
END
请教一下,A(k)怎么就越界了呢?应该如何修改呢?
回复列表 (共10个回复)
沙发
jstzhurj [专家分:4680] 发布于 2010-09-11 12:12:00
你还没ALLOCATE呐
板凳
sinan [专家分:0] 发布于 2010-09-11 13:54:00
如何ALLOCATE呢?不知道A的大小啊。
3 楼
jstzhurj [专家分:4680] 发布于 2010-09-11 13:58:00
你这么小的一个数组,用动态数组不是自找麻烦么?直接INTEGER::A(20)不就得了?
4 楼
sinan [专家分:0] 发布于 2010-09-11 14:06:00
不是这个程序,是一个大程序,里面的数组有5000个数组成,我只是简化了一下,看看怎么个解决法。
5 楼
jstzhurj [专家分:4680] 发布于 2010-09-11 14:38:00
PROGRAM Main
IMPLICIT NONE
INTEGER i,j,k
INTEGER,ALLOCATABLE::A(:)
INTEGER::C(20)=(/1,2,3,4,5,6,7,8,9,10,3,7,9,2,3,8,5,1,2,3/)
k=0
DO i=1,20,4
DO j=1,20
IF(C(j)==C(i))THEN
k=k+1
END IF
END DO
END DO
ALLOCATE (A(k))
k=0
DO i=1,20,4
DO j=1,20
IF(C(j)==C(i))THEN
k=k+1
A(k)=j
END IF
END DO
END DO
WRITE(*,*) A
END
6 楼
sinan [专家分:0] 发布于 2010-09-11 14:48:00
谢谢,可以正常运行了,就是代码长了一些。
7 楼
jstzhurj [专家分:4680] 发布于 2010-09-11 15:06:00
[quote]不是这个程序,是一个大程序,里面的数组有5000个数组成,我只是简化了一下,看看怎么个解决法。[/quote]
5000也不是一个多大的数,直接开一个5000的数组得了,这样不必两次循环了,代码就短了。
8 楼
sinan [专家分:0] 发布于 2010-09-11 15:20:00
可以是可以,就是通用性差了些,读入是其他大小的数组还得改程序。
9 楼
jstzhurj [专家分:4680] 发布于 2010-09-11 15:45:00
你就开个1M的数组的数组,也不是什么大不了的事情。
10 楼
BiCGSTAB [专家分:780] 发布于 2010-09-12 01:07:00
DO i=1,20,4
DO j=1,20
一共循环100次。
如果数组C中元素全部相同,那么A数组规模达到最大,因此ALLOCATE(A(100))。
循环全部执行完之后,K-1就等于A数组中实际元素的个数(K<=101)。
这样你就不用把程序改长了。。。
我来回复