在循环中为数组赋值
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=2
和i=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)
在我的代码中:
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
数组只写了两次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)