我想在数组中插入未知数量的值(无论顺序如何)。 我可以先读取要插入的值,然后分配可分配的数组,最后读取其值,如下面的代码所示
PROGRAM try
IMPLICIT NONE
INTEGER :: N
REAL, DIMENSION(:), ALLOCATABLE :: x
WRITE (*,*) "how many values?"
READ (*,*) N
ALLOCATE(x(N))
WRITE (*,*) "insert the values"
READ (*,*) x
END PROGRAM
如果我想插入值而不声明分配数组之前有多少,该怎么办? 我想我应该使用DO WHILE循环以升序插入值,直到插入一个降序值,从而表明序列已经结束。我认为代码的一部分将是以下内容,
index = 1
WRITE(*,*) x
READ(*,*) x(index)
exit = .FALSE.
DO WHILE (exit.EQV..FALSE.)
index = index + 1
READ(*,*) x(index)
IF (x(index)>x(index-1)) THEN
exit = .TRUE.
index = index - 1
END IF
END DO
如何声明数组x
?
答案 0 :(得分:0)
我试着使用以下解决方案,在概念的基础上进行了大量的内存分配和重新分配。由@High Performance Mark表达。
PROGRAM COEFFS
USE COMPACT
IMPLICIT NONE
REAL, DIMENSION(:), ALLOCATABLE :: x,x2
INTEGER :: nL,nR,nT,index,oL,oR
LOGICAL :: exit
WRITE(*,*) "Input an increasing sequence of reals (end the sequence &
& with the first decreasing element, which will be discarded):"
index = 1
ALLOCATE(x(index))
READ(*,*) x(index)
ALLOCATE(x2(index))
x2 = x
DEALLOCATE(x)
exit = .FALSE.
DO WHILE (exit.EQV..FALSE.)
index = index + 1
ALLOCATE(x(index))
x(1:index-1) = x2
READ(*,*) x(index)
DEALLOCATE(x2)
ALLOCATE(x2(index))
x2 = x
DEALLOCATE(x)
IF (x2(index)<x2(index-1)) THEN
exit = .TRUE.
index = index - 1
ALLOCATE(x(index))
x = x2(1:index)
END IF
END DO
DEALLOCATE(x2)
WRITE(*,*) "x = ", x
END PROGRAM
由于数组是通过键盘输入的,我不认为分配/重新分配是一个问题,因为它发生的速度远远超过我的手指输入值的速度,不是吗? 我仍然认为代码可以做得更好。例如,使用两个数组是利用分配/重新分配的唯一方法吗?