两个警告“此局部变量与全局变量具有相同的名称”和“没有匹配的IF的ELSE”

时间:2020-10-01 10:45:26

标签: variables debugging scope conditional-statements autohotkey

我收到两个奇怪的警告。

  • 一个是“此局部变量与全局变量具有相同的名称”, 指wxwywwwh
  • 另一个是“ ELSE,没有匹配的IF”,指的是两个if-else语句。

这是整个脚本。

#NoEnv  
#Warn  
SendMode Input  
SetWorkingDir %A_ScriptDir%  

screen_scaling_factor := A_ScreenDPI/96

^p::mouse_move_win(200,300)

mouse_move_win(x,y,horizontal:="left",vertical:="top",mouse_click:=""){
    wingetpos,wx,wy,ww,wh,a
    global screen_scaling_factor
    if horizontal="left"{
        x1 := wx + x * screen_scaling_factor
    }else{
        x1 := wx + ww - x * screen_scaling_factor
    }
    if vertical="top"{
        y1 := wy + y * screen_scaling_factor
    }else{
        y1 := wy + wh - y * screen_scaling_factor
    }
    DllCall("SetCursorPos", int, x1, int, y1)       
}
  • 但是,当我添加local作为启用“局部力模式”的功能的第一行时,第一条警告消失了。

  • 当我在if条件中添加括号或移除其后的花括号时,如下所示,第二个警告消失了。

if (horizontal="left"){
    x1 := wx + x * screen_scaling_factor
}else{
    x1 := wx + ww - x * screen_scaling_factor
}

if horizontal="left"
    x1 := wx + x * screen_scaling_factor
else
    x1 := wx + ww - x * screen_scaling_factor

知道为什么会这样吗?

2 个答案:

答案 0 :(得分:1)

如果要使用旧式if语句(请不要),则不能从与if语句相同的行开始括号。您必须将起始括号{放下一行。

但是请只使用现代表达风格的if语句,如下所示:

mouse_move_win(x,y,horizontal:="left",vertical:="top",mouse_click:=""){
    wingetpos,wx,wy,ww,wh,a
    global screen_scaling_factor
    if (horizontal="left"){
        x1 := wx + x * screen_scaling_factor
    }else{
        x1 := wx + ww - x * screen_scaling_factor
    }
    if (vertical="top"){
        y1 := wy + y * screen_scaling_factor
    }else{
        y1 := wy + wh - y * screen_scaling_factor
    }
    DllCall("SetCursorPos", int, x1, int, y1)       
}

另外,我个人认为这种支撑风格令人恶心,但这当然只是个人喜好哈哈。
但是,以防万一,您可以在if / else语句中省略大括号中的括号:

mouse_move_win(x,y,horizontal:="left",vertical:="top",mouse_click:="")
{
    wingetpos,wx,wy,ww,wh,a
    global screen_scaling_factor
    if (horizontal="left")
        x1 := wx + x * screen_scaling_factor
    else
        x1 := wx + ww - x * screen_scaling_factor
    if (vertical="top")
        y1 := wy + y * screen_scaling_factor
    else
        y1 := wy + wh - y * screen_scaling_factor
    DllCall("SetCursorPos", int, x1, int, y1)       
}

编辑:哦,看来您已编辑您的帖子。在您进行编辑之前,我已经开始输入该文字,但是后来我不得不去做一些事情。
无论如何,我的回答应该可以回答您的问题。

答案 1 :(得分:0)

使用mouse_move _win(200,300)代替mouse_move(200,300)

当定义horizo​​ntal:=“ left”时,它表示Left是其默认值,这意味着如果未提供任何值,则假定它为left。所以

如果horizo​​ntal = left

不必要。

因此,我想您的代码应该与if和else组合相反。

^p::mouse_move_win(200, 300)

mouse_move_win(x, y, horizontal:="left", vertical:="top", mouse_click:="") {
    wingetpos,wx,wy,ww,wh,a
    global screen_scaling_factor
    if horizontal=right
        x1 := wx + ww - x * screen_scaling_factor
    else
        x1 := wx + x * screen_scaling_factor
    if vertical=bottom
        y1 := wy + wh - y * screen_scaling_factor
    else
        y1 := wy + y * screen_scaling_factor
    DllCall("SetCursorPos", int, x1, int, y1)
}

这对我来说很完美

相关问题