在循环

时间:2015-06-07 16:48:51

标签: arrays loops fortran fortran90 gfortran

在我的代码中:

DO i=1,numJog,1
    IF(val(i) .EQV. .TRUE.)THEN
            DO j=1,contVenc,1
                result(j) = i
            END DO
    END IF
END DO

其中val是逻辑数组,result是整数数组。

例如,如果val是:

F
T
F
T

然后,i=2i=4

但是result数组只写了两次。例如:

DO i=1,contVenc,1
    WRITE(*,*) result(i)
END DO

结果是:

4
4

而不是

2
4

如果我在代码中做了一些更改,例如:

DO i=1,numJog,1
    IF(val(i) .EQV. .TRUE.)THEN
        WRITE(*,*) i
    END IF
END DO

结果是:

2
4

我想要的。

结论,我认为第二个循环导致了这个问题。

1 个答案:

答案 0 :(得分:3)

是的,你的第二个循环是错误的。你还没有说contVenc是什么,但它在你所拥有的片段中的任何一点都不会发生变化。这意味着,只要result中有.TRUE.,就会分配val的相同元素。

在您的情况下,对于第一个2,它们都设置为.TRUE.,然后第二个设置为4

你更有可能意味着(额外整理):

j = 0
DO i=1,numJog
    IF (val(i)) THEN
        j = j+1   ! Test this as a bound
        result(j) = i
    END IF
END DO

但是,我只是使用PACK。您的预期循环与

具有相同的效果
result(1:COUNT(val(1:numJog))) = PACK([(i,i=1,numJog)], val(1:numJog))

再次希望result足够大。

也就是说,如果numJog只是数组val的大小(也就是说,你不是在子数组上执行此操作),那么,作为高性能标记评论,

result(1:COUNT(val)) = PACK([(i,i=1,SIZE(val))], val)

避免单独跟踪此尺寸。

最后,使用result一个可分配的(Fortran 2003)数组,你甚至(但仍然可以)担心计算所需索引的数量并且数组足够大:

result = PACK([(i,i=1,SIZE(val))], val)