2015-02-24 142 views
0

我在Fortran程序中有一個字符串數組。 不是單個字符串。我知道數組中的一個值是「foo」。我想知道包含「foo」的數組的索引。有沒有辦法找到比強力循環以外的索引?我顯然不能使用「minloc」例程,因爲我沒有在這裏處理數字。再次,只是爲了確保:我不是在字符串中搜索子字符串。我正在搜索一個字符串數組中的字符串。查找字符串數組中的字符串值

+0

[不是一個非常有用的評論,但:'findloc'工程字符數組? [這不是F90,也沒有廣泛實施。] – francescalus 2015-02-24 18:44:16

回答

1
implicit none 
integer i 
character*8 a(100) 
do i = 1,100 
    a(i)='foo' 
enddo 
a(42)='bar' 
call f(a,len(a(1)),shape(a)*len(a(1)),'bar  ') 
end 

subroutine f(c,n,all,s) 
implicit none 
integer n,all 
character*(*) s 
character*(all) c 
write(*,*)index(c,s)/n+1 
end 

a.out -> 42 

請注意,此代碼將整個數組視爲一個大字符串並搜索子字符串,以便它還會查找與組件字符串邊界不匹配的匹配項。

例如。

a(2)='xxbar ' 
a(3)='  yyy' 

,以確保您找到一個index是n的整數倍需要一些額外的工作(由時間,當然你做一個簡單的循環可能看起來更好):錯誤匹配與相鄰的條目,如發生

+0

對於「額外的工作」,大概意思是處理像'call f(['fob','arb','bar'],3,9 ,'bar')'? [在您的電話中缺少一個參數。] – francescalus 2015-02-24 20:31:59

+0

哎呀,感謝您的支持。 – agentp 2015-02-24 20:33:01

0

好吧,想到它後,我想出了這個。它的工作原理,如果「foo」被稱爲是無論是從陣列缺席,或位於一個且只有一個地方:

character(len=3) :: tags(100) 
integer :: test(100) 
integer :: str_location 
! populate "tags" however needed. Then search for "foo": 
test=(/(i,i=1,100)/) 
where (tags.ne."foo") test=0 
str_location = sum(test) 

我猜這實際上比蠻力循環更慢,但它使緊湊型碼。我想過用「max test」來填充「測試」,但是這並沒有說明陣列中沒有「foo」的可能性。意見?

+0

如果你想在沒有'findloc'的情況下使用「compact」,那麼'minval(pack([(i,i = 1,100)],tags.eq.'foo'))''。但這不是一個好方法。 – francescalus 2015-02-25 23:00:06