2016 - 2024

感恩一路有你

脚本开发教程:解决“类型不匹配”问题的三个深坑

浏览量:4079 时间:2024-08-18 10:44:45 作者:采采

在编写脚本的过程中,经常会遇到“类型不匹配”这样的错误提示。无论是眯着眼睛找、斜着眼睛找,似乎都无法找到错误在哪里。为了帮助大家更好地理解并解决这个问题,我将分享曾经困扰过我的三个“类型不匹配”深坑,以及造成这些深坑的原因。如果你已经知道这些,可以加深下印象;如果还没有遇到过,那就看一看,防范于未然。

11号坑:变量类型不同导致的无限循环

让我们来看一个例子,我们想要打开三个记事本,并分别将它们的窗口标题命名为1、2、3。然而,运行结果却只打开了一个记事本,后续的操作似乎消失了。

```vb

For i 1 to 3

RunApp "Notepad.exe"

hwnd (0, "无标题 - 记事本") '获取记事本句柄

Loop while (Hwnd0)

Do

If stext i Then

Exit Do

End If

Call (hwnd,i)

stext (hwnd)

Loop

```

这个问题的根源是`stext i`这句代码。`stext`是获取窗口标题命令的返回值,是字符串型;而`i`是整型。不同类型的变量是不能直接进行比较的。因此,字符串`stext`不等于整型`i`,不满足判断条件,就进入了无限循环,重复地修改第一个打开的记事本的窗口标题。正确的写法应该是:

```vb

For i 1 to 3

RunApp "Notepad.exe"

hwnd (0, "无标题 - 记事本") '获取记事本句柄

Loop While (Hwnd 0)

Do

If cint(stext) i Then

Exit Do

End If

Call (hwnd,i)

stext (hwnd)

Loop

```

42号坑:转换类型失败导致的错误

现在假设我们想要使用大漠插件的找字功能,在游戏中找到一个数字,并判断该数字的大小。

```vb

call Lib.大漠注册.register()

s dm.Ocr(0,0,2000,2000,"9f2e3f-030303",1.0)

If cint(s) > 2000 Then

MessageBox "金额超出"

End If

```

我们首先调用了大漠插件的注册命令库,并且将获得的数据存放在变量`s`中。小编已经学乖了,将字符串变量`s`转换成了整型。然而,为什么还是报错“类型不匹配:CINT”呢?

问题出在`cint(s)`这里。当我们输出变量`s`时,会发现它实际上是一个空值。即使找字没有找到相应的数字,函数仍然会返回一个空值。而`cint`函数无法将空值转换成整型。因此,我们需要先判断是否找到了数字,再进行类型转换:

```vb

call Lib.大漠注册.register()

s dm.Ocr(0,0,2000,2000,"9f2e3f-030303",1.0)

If s <> "" Then

If cint(s) > 2000 Then

MessageBox "金额超出"

End If

End If

```

73号坑:变量类型不匹配导致的奇怪比较结果

第三个坑与第一个坑非常相似,都涉及到了变量类型不一致所导致的问题。但是,这个坑更加隐蔽。

```vb

Dim 数组(1)

数组(1) 1

S "2"

If 数组(1) < S Then

MessageBox "啥?这也能比较?"

End If

```

由于时间过去已久,我已经找不到原来的代码例子,所以用了这个简化的例子来说明。在原来的代码中,变量`s`保存了我获取到的数据,我一直认为这个数据是整型的,所以没有进行类型转换。然而,实际上它是字符串型。如果强行将字符串型变量和整型变量进行比较,它们会按照一种奇怪的规则进行比较。无论数组(1)中是1还是10000,`数组(1) < S`的判断结果都是真。这句判断欺骗了我多少次,甚至让我怀疑其他的代码。经过一番艰苦的排查之后,我才意识到这个问题,让一个爱笑的小编从此失去了笑容。

以上就是三个常见“类型不匹配”问题的解析和解决方法。希望对大家有所帮助,避免掉入这些深坑。编写脚本时,注意变量类型的匹配和转换,可以提高脚本的稳定性和效率。

版权声明:本文内容由互联网用户自发贡献,本站不承担相关法律责任.如有侵权/违法内容,本站将立刻删除。