在寫指令碼的過程中,是否經常遇到“型別不匹配:xxx” 這樣的錯誤提示。瞪著眼睛找、眯著眼睛找、斜著眼睛找,就是找不到錯在哪兒啊有木有?小編分享下,曾經困擾過小編的三個 “型別不匹配” 深坑,以及造成這些深坑的原因。已經知道的童鞋,看一看加深下印象。還沒有遇到過的童鞋,看一看,防範於未然~
工具/原料
按鍵精靈2014
方法/步驟
1號坑
下面的例子要實現開啟三個記事本,然後將三個記事本視窗標題分別命名為1 ,2 ,3可是,執行的結果,為什麼只開啟了一個記事本呢?後續的操作去哪兒了?
For i= 1 to 3
RunApp "Notepad.exe"
do
hwnd = Plugin.Window.Find(0, "無標題 - 記事本")//獲取記事本控制代碼
Loop while (Hwnd=0)
Do
If stext = i Then
Exit Do
End If
call Plugin.Window.SetText(hwnd,i)
stext = Plugin.Window.GetText(hwnd)
Loop
Next
1號坑大解析: stext = i //錯就錯在這句程式碼。 stext是獲取視窗標題命令的返回值,是字串型。 i是整型。 變數型別不同是不能比較的。 所以,字串 stext 不等於 整型 i ,不滿足判斷條件。就進入了無限迴圈,重複的修改第一個開啟的記事本的視窗標題。
正確寫法:
For i= 1 to 3
RunApp "Notepad.exe"
do
hwnd = Plugin.Window.Find(0, "無標題 - 記事本")//獲取記事本控制代碼
Loop While (Hwnd = 0)
Do
If cint(stext) = i Then
Exit Do
End If
call Plugin.Window.SetText(hwnd,i)
stext = Plugin.Window.GetText(hwnd)
Loop
Next
2號坑
使用大漠找字的功能,找到遊戲裡的數字,判斷該數字的大小。call Lib.大漠註冊.register() //在大漠註冊的命令庫中已經包含了大漠外掛註冊,字型檔載入,大漠物件建立等操作。並且,經歷了1號坑之後小編也學乖了,將字串變數s轉換成了整型。可是,為什麼還是錯?
錯誤提示資訊:型別不匹配: 'CINT'
call Lib.大漠註冊.register()
s = dm.Ocr(0,0,2000,2000,"9f2e3f-030303",1.0)
If cint(s) > 2000 Then
MessageBox "金額超出"
End If
2號坑大解析: 錯在這裡: cint(s) 。 用 TracePrint s 將s輸出之後,會發現,其實 s 是一個空值。 找字沒有找到,所以返回了空值。 而 cint 是無法將空值轉換成整型的
3號坑
3號坑和1號坑十分相似,都是變數型別不一樣,然後進行大小對比導致的。不同的地方在於,3號坑更加坑。
Dim 陣列(1)
陣列(1) = 1
S="2"
If 陣列(1) < S Then
MessageBox "啥?這也能比較?"
End If
由於事發在很久以前,小編已經找不到原來的程式碼例子,所以用上面的簡化例子。 在原始碼中 變數 s 存放的是小編獲取到的資料,小編一直認為這個資料是整型的,所以沒有轉換型別。沒想到它居然是字串型。如果強硬的將字串型變數和整型變數進行比較,它們是以一種奇怪的規則在比較。不管陣列(1)中是1或者是10000, 陣列(1) < S 的判斷都是成立的。這句判斷欺騙了小編多少感情~甚至還讓小編去懷疑其它的程式碼,經過一遍遍辛苦的排查,讓一個愛笑的小編從此都沒有了笑容。