在循环中为数组赋值

Assigning values of an array in a loop

在我的代码中:

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数组只写了两次4。例如:

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

如我所愿

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

是的,你的第二个循环在这里有问题。您还没有说 contVenc 是什么,但至关重要的是,您那里的片段中的任何一点都不会改变。这只是意味着只要您在 val.

中有 .TRUE.,就会分配给 result 的相同元素

在您的情况下,第一个 .TRUE. 都设置为 2,第二个 4 都设置为 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 的大小(也就是说,您不只是在子数组上执行此操作),那么,正如 High Performance Mark 评论的那样,

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

避免单独跟踪此尺寸。

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

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