2014-01-26 41 views
0

我正在使用Fortran 90.我有一個字符串,聲明爲CHARACTER(20) :: Folds,它的命令行參數的值爲x:y:z,其中x,y和z都是整數。然後我需要從該字符串中挑出數字並將它們分配給適當的變量。這是我試圖做它:從Fortran中的字符串中提取整數

i=1 
do j=1, LEN_TRIM(folds) 
    temp_fold='' 
    if (folds(j).neqv.':') then 
     temp_fold(j)=folds(j) 
    elseif (i.eq.1) then 
     read(temp_fold,*) FoldX  
     i=i+1 
    elseif (i.eq.2) then 
     read(temp_fold,*) FoldY 
     i=i+1 
    else 
     read(temp_fold,*) FoldZ 
    endif 
enddo 

當我編譯這個我得到的錯誤:

unfolder.f90(222):錯誤#6410:這個名字還沒有被宣佈爲一個數組或一個函數。 [FOLDS]

[stud2 @費曼vec2ascii] $如果(倍(J).neqv。 ':'),然後 附近意外的標記`Ĵ語法錯誤」 [stud2 @費曼vec2ascii] $ ----- ---^

unfolder.f90(223):錯誤#6410:此名稱尚未聲明爲數組或函數。 [TEMP_FOLD]

[stud2 @費曼vec2ascii] $ temp_fold(J)=倍(J)

語法錯誤附近意外的標記'J」

我如何可以提取這些數字?

+0

我可以建議你讓編譯器輸出更清晰,以利於後代?我本來想去嘗試一下,但最好是把它做好。 – francescalus

回答

2

您可以使用index固有函數來定位第一個冒號字符串中的位置,如i。然後使用內部讀取從前面的子字符串中讀取整數xread (string (1:i-1), *) x。然後將此過程應用於從i+1開始的子字符串以獲得y。重複z

P.S.您是來自bash而不是Fortran編譯器的錯誤消息嗎?

+0

他們來自fortran編譯器,當我複製到剪輯板時,它將bash插入其中。 –

1

folds一個字符變量,要訪問子字符串需要一個(.:.)。也就是說,要訪問索引爲j的單個字符:folds(j:j)

如果沒有這個,編譯器會認爲folds必須是一個數組(它不是)或函數(這不是你想要的)。這是什麼叫:

這個名字還沒有被宣佈爲一個數組或一個函數。

但是就解決你的問題而言,我第二個答案是@ M.S.B。因爲它更優雅。此外,對於原來的循環(foldstemp_fold中的(j:j)更正),您將依靠每個x,y和z爲單個數字的整數。這個其他答案更一般。

+0

謝謝,如果我使用(j:j),那麼我的方法工作。我喜歡MSB的方法,從這些ifs和循環中保存。 –