从键盘读取未知大小的数组

Read array of unknown size from keyboard

我想在数组中插入未知数量的值(无论顺序如何)。 我可以先读取要插入多少个值,然后分配可分配数组,最后读取它的值,如下面的代码

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

我尝试了以下解决方案,建立在@High Performance Mark 表达的概念 "a lot of memory allocation and reallocation" 的基础上。

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

通过键盘输入数组,我认为 allocation/reallocation 不是问题,因为它的速度比我用手指输入值的速度快得多,不是吗? 我仍然认为代码可以做得更好。例如,使用两个数组是利用 allocation/reallocation?

的唯一方法