回 帖 发 新 帖 刷新版面

主题:求教:这个程序怎么越界的?

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个回复)

沙发

你还没ALLOCATE呐

板凳

如何ALLOCATE呢?不知道A的大小啊。

3 楼


你这么小的一个数组,用动态数组不是自找麻烦么?直接INTEGER::A(20)不就得了?

4 楼

不是这个程序,是一个大程序,里面的数组有5000个数组成,我只是简化了一下,看看怎么个解决法。

5 楼


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 楼

谢谢,可以正常运行了,就是代码长了一些。

7 楼

[quote]不是这个程序,是一个大程序,里面的数组有5000个数组成,我只是简化了一下,看看怎么个解决法。[/quote]

5000也不是一个多大的数,直接开一个5000的数组得了,这样不必两次循环了,代码就短了。

8 楼

可以是可以,就是通用性差了些,读入是其他大小的数组还得改程序。

9 楼

你就开个1M的数组的数组,也不是什么大不了的事情。

10 楼

DO i=1,20,4
DO j=1,20
一共循环100次。
如果数组C中元素全部相同,那么A数组规模达到最大,因此ALLOCATE(A(100))。
循环全部执行完之后,K-1就等于A数组中实际元素的个数(K<=101)。

这样你就不用把程序改长了。。。

我来回复

您尚未登录,请登录后再回复。点此登录或注册