2012-01-12 47 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