2012-01-12 71 views
1

的Fortran我們編碼爲以下幾點:Fortran語言:靈活的陣列過濾

 
!vectors w,q are of the same size 
... 
w = ...   !a vector of integers [0,...,n) 
if (allocated(t)) deallocate(t); 
allocate(t(count(w/=0))) 
t = pack(q, w/=0) 
m = count(t>0) 
if (allocated(b)) deallocate(b) 
allocate(b(m)) 
b = pack(t,t>0) 

Python的翻譯代碼:

 
t = q[w!=0] 
b = t[t>0] 

不知道我們做的Fortran語言的實現是正確的。請注意,這是一個非常大的計劃的一部分,我們得到了一些惱人的運行時錯誤,有時候就算沒有消息,但崩潰......

+0

您使用的編譯器是什麼?嘗試啓用盡可能多的診斷編譯器選項。 – 2012-01-12 04:52:28

+0

@ M.S.B。它是'GFortran'。 – Developer 2012-01-12 04:55:16

+1

嘗試:-02 -fimplicit-沒有-Wall -Wline截斷-Wcharacter截斷-Wsurprising -Waliasing -Wimplicit接口-Wunused參數-fwhole文件-fcheck =所有-std = F2008 -pedantic -fbacktrace – 2012-01-12 05:57:53

回答

2

在F2003,聲明T細胞和B作爲分配的載體和簡單的寫:

t = pack(q, w/=0) 
b = pack(t,t>0) 

這已經被幾個編譯器支持,如ifort的gfortran(GCC 4.6)(Intel編譯器套件> 11.x)

+2

在gfortran它實際上並不好。可分配的標量是可以的,但即使在gfortran 4.7中,數組仍然存在問題。而且你鬆散的便攜性。對於Fortan來說,很多人都選擇高性能計算機,而這些計算機可能會有較老版本的編譯器。 – 2012-01-12 12:04:27

+0

弗拉基米爾F - 我認爲這不太可能;我所知道的所有HPC中心都保持其編譯器和工具的最新狀態;並且由於Fortran 90的.. – 2012-01-12 12:43:05

+0

那好具有在F2003這樣簡單(=效率)包已經存在了。我們現在在GCC4.5.2上,它不會在編譯時失敗,但輸出(t或b)是空的! – Developer 2012-01-13 11:03:23