在我的代码中:
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=2
和i=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
我想要的。
结论,我认为第二个循环导致了这个问题。
答案 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)