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

时间:2016-01-28 14:11:33

标签: memory-management fortran allocation fortran95

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

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

1 个答案:

答案 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

由于数组是通过键盘输入的,我不认为分配/重新分配是一个问题,因为它发生的速度远远超过我的手指输入值的速度,不是吗? 我仍然认为代码可以做得更好。例如,使用两个数组是利用分配/重新分配的唯一方法吗?