2016-01-28 59 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時發生的事情)。除此之外,我的方法是做出這種可怕事情的最好方式(即最糟糕的方式)(即從鍵盤輸入未知尺寸的數組而不指定尺寸本身)? –