2016-03-07 52 views
1

我寫了一個簡單的包裝爲 '()裝飾' 的Fortran內部函數的方便使用和 'adjustl()':的Fortran包裝器字符函數TRIM(),adjustl()

character(len=*) FUNCTION trimadjl(str) 

character(len=*), intent(inout) :: str 

trimadjl = trim(adjustl(str)) 

END FUNCTION 

然而,我「M無法使用它,由於GNU Fortran編譯失敗,出現以下消息:

farm_par.f90:633:31: 

19 OPEN(iout,file=TRIMADJL(rankstr//fout),access='sequential',status='unknown', & 
          1 
Warning: Non-variable expression in variable definition context (actual argument to INTENT = OUT/INOUT) at (1) farm_par.f90:633:22: 

19 OPEN (iout,file=TRIMADJL(rankstr//fout),access='sequential',status='unknown', & 
        1 
Error: Function ‘trimadjl’ is declared CHARACTER(*) and cannot be used at (1) since it is not a dummy argument 

該函數被聲明爲在子程序的報頭外部:

character(len=*), external :: trimadjl 
+1

有點遺憾,但是不需要「修剪」你給'file ='的字符串。空白填充不會傷害任何東西。你可以在這裏使用'adjustl'。 – agentp

+0

它當然不會受傷。但是我有用於後處理的shell腳本,如果文件名中有空格,就會失敗。 – mabalenk

回答

3

現代的Fortran具有分配的延遲長字符串爲這樣:

FUNCTION trimadjl(str) 
character(len=:), allocatable :: trimadjl 
character(len=*), intent(in) :: str 

trimadjl = trim(adjustl(str)) 

END FUNCTION 

這樣的功能不能是外部的,將其放置到一個模塊。另請參閱Fortran character-returning function of unknown length

由於@HighPerformanceMark註釋,第一個錯誤消息來自您將虛擬參數str標記爲intent(inout),然後您將一個表達式傳遞給它。 rankstr//fout是一個複合表達式,不能傳入intent(inout)函數,因爲它不是一個變量。儘可能在函數中使用intent(in)參數。

不要使用character(*)返回功能,除非你真的知道這意味着什麼詳細!儘可能避免使用它們。它們已經過時並且非常混亂。請參閱假設長度字符函數http://fortranwiki.org/fortran/show/Modernizing+Old+Fortran」。不要使用它們,甚至可能忘記它們存在。

+0

我已經創建了一個模塊,並在我的主程序中使用了'trimadjl()'函數實現。但是,我收到另一個錯誤:(1)處的FILE標記必須是CHARACTER類型。不知何故,該程序沒有選擇函數的返回類型。 – mabalenk

+0

@mabalenk什麼是標籤?沒有一個更完整的例子,我什麼都不能說。 –

+0

'tag'是文件打開例程的屬性:OPEN(iout,file = TRIMADJL(rankstr // fout),...)錯誤:(1)處的FILE標記必須是CHARACTER類型 – mabalenk