2012-12-14 50 views
2

我正在嘗試使用gfortran 4.4.6編譯別人的FORTRAN代碼。原來的編碼器使用了Compaq FORTRAN之類的東西。將字符串長度插入fortran格式說明符

有問題的代碼應該讀像「foo.txt的」文件名和創建一個名爲「foo_c.txt」新文件:

 
    file_label_end = SCAN(filename, '.') - 1 
    WRITE (output_filename,5) filename 
    5 FORMAT (A<file_label_end>, '_c.txt') 

gfortran抱怨的字符說明符的開度角托架。也就是說,他不是「A3」,而是「A <(值爲3的變量)>」。我找不到有關從變量中插入格式寬度的任何信息......這可能嗎?如果沒有,解決這個問題的最好方法是什麼?

更新:

這似乎是工作(編譯):

file_label_end = SCAN(par_filename, '.', .TRUE.) + 1 
output_filename = par_filename(1:file_label_end) // '_c.par' 

,但後來我也有類似的情況:

12 FORMAT (<n-1>F10.5) 
... 
READ(1,12) (cat_parm (blk,j), j = 1,n-1)

,我試圖通過創建來解決格式字符串:

write(fmt12,'(I0,A4)') n-1, 'F10.5' 
!12 FORMAT (fmt12) 
12 FORMAT (fmt=fmt12)

但在「格式化」的「T」獲取有關

回答

2

在Fortran編輯描述符中使用<>是非標準的,雖然廣泛實現。你當然可以建立從變量編輯描述符,標準的方式是通過內部寫,像這樣(忽略聲明):

format_string = '' 
write(format_string,'(a1,i0,a6)') 'A', file_label_end,'''_c.txt''' ! WARNING I haven't tested this 

然後

write(output_filename,fmt=format_string) filename 

但在你的情況,這是不完全必要。你可以試試這個,而不是

file_label_end = SCAN(filename, '.') - 1 
WRITE (output_filename,'(a)') filename(1:file_label_end)//'_c.txt' 

隨着「一」編輯描述符省略的寬度意味着在表達式中的所有字符將被寫入。您可能想聲明

character(len=*), allocatable :: output_filename 

如果您還沒有這樣做。

+0

非常有幫助。另外,SCAN的BACK選項很有用。但我試圖將這個應用到程序中的另一個實例。我創建了一個包含格式的字符串變量;當我使用它(「12 FORMAT(fmt12)」或「12 FORMAT(fmt = fmt12)」)時,編譯器將該行標記爲「格式字符串中需要的非負寬度」(它實際上標記了fmt中的't'兩種情況])。 –

0

最簡單的是用現代FORTRAN

WRITE (output_filename,'(a)') trim(filename) // '_c.txt' 

否則我會寫數字「格式的字符串所需的非負寬度」錯誤標記在格式字符串中使用類似的內部寫入。

+0

是的,不要試圖在下次早餐前回應... –