我具有一些变量的功能,这将产生一个包含负值和正值(实数)的数组。但是,由于只有正值对我身体有意义,因此我想将数组内的所有负值都设置为零。
我在下面提供了与此功能相关的代码:
我之所以声明一个临时变量'res'是因为我试图在IF-ELSE中建立我在代码中标记的位置,如下所示:
If (res >= 0) Then
result = res
Else
result = 0
End If
但是错误提示如果需要,S_A的标量值表达式。
如果使用res(il,ir)代替res,则
If (res(il,ir) >= 0) Then
result(il,ir) = res(il,ir)
Else
result = 0
End If
错误表示错误#6351: The number of subscripts is incorrect
。
有什么办法可以实现这个想法?
Function somefunction(x,y,il,ir) Result(result)
!! ---- begin of declaration ---------------------------
Implicit None
!! boundary indices
Integer, Intent ( in ) :: il,ir
!! the vars
Real ( kind = rk ), Intent ( in ), Dimension ( il:ir ) :: x,y
!! the result
Real ( kind = rk ), Dimension ( il:ir ) :: result
!! temp vars
Real ( kind = rk ), Dimension ( il:ir ) :: res
!! loop index
Integer :: i
!! ---- end of declaration -----------------------------
res = x+y
SA = S_A
!!IF-ELSE!!
End Function somefunction
答案 0 :(得分:1)
如果要在数组上明智地使用if
语句元素,则应使用where
语句,例如:
program min0
implicit none
real :: res(5, 5), result(5, 5)
call random_number(res)
res=res-0.5
print '(5(F5.2,X))', res
where (res>=0)
result = res
elsewhere
result = 0
end where
print *, '---------------------------------------'
print '(5(F5.2,X))', result
end program min0
我不知道为什么会出现下标错误,如果您告诉我们错误发生在代码的哪一行,可能会有所帮助。但是,当然,在第二个代码中,如果result
大于0,则更新res
的单个元素,但如果不是,则将整个数组result
设置为0。几乎可以肯定这不是您想要的。
欢呼
答案 1 :(得分:0)
该函数似乎从(il:if)取X和Y,从(3:6)得出,因此是一个向量。但是,索引稍后会说(il,ir),这意味着它是一个二维数组。
在哪里似乎是一个不错的选择。另一个可能是关联位置的逻辑掩码。 PACK和unpack是usd,这很有意义,
为什么还要说向量的大小?
ELEMENTAL Function somefunction(x,y) Result(Res)
!! ---- begin of declaration ---------------------------
Implicit None
Real ( kind = rk ), Intent (IN), Dimension (:) :: x,y
!! the result
Real ( kind = rk ), Dimension ( il:ir ) :: res
!! loop index
Integer :: i
!! ---- end of declaration -----------------------------
res = x+y
WHERE res <= 0
Res = 0
ENDWHERE
!!IF-ELSE!!
End Function somefunction
然后在调用方...在您不确定的范围内调用该函数。
Z(1:5) = somefunction(X(1:5),Y(1:5))