2012-03-26 64 views
11

我想要Fortran寫入語句的格式取決於某個變量。例如,我可以這樣寫:依賴於變量的輸出的格式字符串

write(*,'(3f15.3,3f9.2)') x,y,z,(var(i),i=1,nvari) 

其中nvari = 3。但是,如果在某些情況下,我實際上有4個變量(即nvari = 4)。我想編寫這樣的事:

write(*,'(3f15.3,nvari(f9.2))') x,y,z,(var(i),i=1,nvari) 

現在,nvari可以是任何東西,輸出將工作,因爲我喜歡。我怎樣才能做出這樣的作品?

+1

是'3'和'4'唯一的選擇?或者你在尋找能處理任何數字的東西嗎? – sarnold 2012-03-26 23:21:52

+1

OP指定'nvari可以是任何'。 – patrickvacek 2013-09-16 17:35:06

回答

14

如果使用的是英特爾Fortran,它有這樣的專有擴展 - 您可以在尖括號現有變量充當符:

write(*,'(3f15.3,<nvari>f9.2)') x,y,z,(var(i),i=1,nvari) 
+0

哦,很酷。謝謝你的回答。這正是我想要的。 – 2012-04-19 22:39:13

+0

有沒有辦法在''上做一些數學運算? 例如,在格式聲明中,「 + 2」或「3 * 」或「 ** 2」我嘗試了一個括號..沒有工作! 編輯:我現在使用的解決方法是定義另一個整數變量'nfmt'並使用它而不是'nvari' – 2013-10-21 10:02:01

+0

有沒有辦法使用'A '格式使用gfortran編譯器? – Chris 2017-08-29 11:44:24

10

如果編譯器支持它,'(3f15.3, *(f9.2))'

如果你有一箇舊的編譯器,只需使用一個更大的數量比你有項目輸出,例如,'(3f15.3, 999(f9.2))'。您不必使用格式。

對於最複雜的情​​況下,你可以編寫一個格式爲字符串,並使用它作爲您的格式:

write (string, '("(3f15.3, ", I4, "(f9.2))")') nvari 
write (*, string) x,y,z, (array(i), i=1,nvari) 

隨着格式的瞭解,包括格式回覆,使用字符串格式很少是必要的。

+0

很酷。謝謝。我正在使用英特爾Fortran編譯器,我認爲它很新。但無論如何,它不會做'(3f15.3,*(f9.2))',所以我正在使用第二種解決方案。順便說一句,「格式回覆」是什麼意思?我做了一些Google搜索,但沒有提出太多。 – 2012-03-27 16:28:16

8

除了直接在寫入語句中寫入格式外,還可以使用字符變量。

character(len=32) :: my_fmt 
my_fmt = '(3f15.3,3f9.2)' 
write(*, my_fmt) x, y, z, (var(i), i = 1, nvari) 

現在可以操縱字符變量寫語句之前包含想要的重複次數,使用所謂的內部寫,或者寫內部文件。

write(my_fmt, '(a, i0, a)') '(3f15.3,', nvari, 'f9.2)' 

(只要保證的my_fmt聲明長度足夠長,以包含整個字符串)

+1

或者,對於最後一個(括號內)語句,請使用allocatable-lenght字符變量。 – 2012-03-27 04:27:55

+0

@HighPerformanceMark:當然,如果你的編譯器支持它,那將是最好的解決方案。 – eriktous 2012-03-27 10:57:24

+1

對於那些使用gfortran編譯器的人來說,這個解決方案是gfortran文檔中推薦的解決方案。請參閱文檔中的「變量FORMAT表達式」(第6.2.3節gfortran 4,gfortran 5;第6.2.2節gfortran 6)。 – 2017-05-26 19:38:15

4

你想寫的東西是這樣的:

write(*,'(3f15.3,nvari(f9.2))') x, y, z, (var(i), i=1,nvari) 

事實上,有一個老把戲在Fortran標準,允許您省略nvari,即:

write(*,'(3f15.3,(f9.2))') x, y, z, (var(i), i=1,nvari) 

,甚至這樣的:

write(*,'(3f15.3,f9.2)') x, y, z, (var(i), i=1,nvari) 

該標準指出,最後一個描述符在格式中爲了容納列表中的所有變量而經常隱含地重複。這是最後一個描述符「可以括號這樣描述的最後被隱式重複,例如:

write(*,'(3f15.3,(2x,f9.2))') x, y, z, (var(i), i=1,nvari)