2016-01-28 52 views
0

我想在数组中插入未知数量的值(不管顺序如何)。 我第一次读到多少值被插入,然后分配分配数组,最后读取它的值,如下面的代码从键盘读取未知大小的数组

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

始终使用标签[tag:fortran]。仅当需要指定特定版本时才添加版本标签,例如,更新版本不可接受。例如,Mark的答案使用Fortran 2003.你真的打算避免这种情况,只使用Fortran 95吗? –

+1

我删除了我对这个问题的回答。充其量,这是错误的方向。在OP指出这个问题涉及从键盘输入数据(虽然我的脸上鼻子清晰,但我错过了,噢噢)我修改了我的答案*这里是如何做* *不这样做*。 OP的第一种方法比OP的第二种方法好得多。如果您对这个主题感兴趣,请参阅http://stackoverflow.com/questions/35077833/fortran-how-do-i-allocate-arrays-when-reading-a-file-of-unknown-大小 –

回答

0

我尝试了以下解决方案,建立在由“高性能标记”表示的“大量内存分配和重新分配”的概念上。

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 

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

+0

“从键盘”已经在标题,因为当我发布的问题。所以,请告诉我问题出在哪里,我很乐意将其删除。 –

+1

是的,我现在看到(d'ohhhh)。这不是问题的错误,而是方法。正如你所看到的,摆弄试图将一个数组分配给一个(最初)未知大小的东西,最多也是很费劲。不要这样做。告诉程序你将输入多少个值,输入它们。 –

+0

噢,我明白了,确定(这是从MATLAB传递到真正的编程语言ahahah时发生的事情)。除此之外,我的方法是做出这种可怕事情的最好方式(即最糟糕的方式)(即从键盘输入未知尺寸的数组而不指定尺寸本身)? –