从键盘读取未知大小的数组
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?
的唯一方法
我想在数组中插入未知数量的值(无论顺序如何)。 我可以先读取要插入多少个值,然后分配可分配数组,最后读取它的值,如下面的代码
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?
的唯一方法