【问题标题】:Two warnings "This local variable has the same name as a global variable" and "ELSE with no matching IF"两个警告“此局部变量与全局变量同名”和“没有匹配 IF 的 ELSE”
【发布时间】:2021-01-17 01:55:53
【问题描述】:

我收到两个奇怪的警告。

  • 一个是“这个局部变量与全局变量同名”, 指的是wxwywwwh
  • 另一个是“ELSE with no matching 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

知道为什么会这样吗?

【问题讨论】:

    标签: variables debugging scope conditional-statements autohotkey


    【解决方案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)       
    }
    

    编辑:哦,看来您编辑了您的帖子。我在您编辑之前开始输入此内容,但后来我不得不去做一些事情。
    不管怎样,我的回答应该能回答你的问题。

    【讨论】:

    • 第一段似乎没有结束。您的意思是我在函数参数中使用表达式样式,所以我最好不要在该函数中使用旧样式?顺便说一句,您对第一条错误消息有任何想法吗?
    • 我不知道我在那里输入了什么,一定是有什么错误,我现在把最后一句话删掉了。而且我很确定第一个错误只是由于大括号错误而导致代码被解释错误。
    【解决方案2】:

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

    当你定义 Horizo​​ntal:="left" 时,它意味着 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)
    }
    

    这对我来说非常有效

    【讨论】:

    • mouse_click:="" 有什么用?只是出于好奇......
    • 我好像忘了粘贴代码的最后一行,当该参数设置为 true 时,它​​实现了“鼠标点击”操作。
    • mouse_move(200,300) 是一个错字。是的,一个与此非常相似的函数,只是没有在第一行声明local,工作得很好,而这没有,这让我感到困惑。 @user14349190
    猜你喜欢
    • 1970-01-01
    • 2016-04-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多