danielmohr91 Posted November 22, 2009 Share Posted November 22, 2009 I'm pretty new to this, so my apologies if this is a silly question. Look at the second line up from the bottom. It starts off fine, but on the third click in it gives me the "Subscript Used with a non-array variable" error for $coord[0] and $coord[1]. I don't understand what I'm doing wrong. I've got it defined as a global variable at the top. It's probably something really simple that I'm overlooking.Global $coord$x=10Here is the problem section of the code. Remember. It's the third line up, the $coord[0] $coord[1] array...If $exit = True Then ExitLoop $coord = PixelSearch($pos[0] - 3, $pos[1] - 3, $pos[0] + 3, $pos[1] + 3, $pixelcheck, 10) SplashOff() $message = "Now Clicking..." SplashTextOn("", $message, 400, 130, 400, 20, 1) If @error Then If $_number_of_errors = $failuresbeforereset Then $new_message = "AUTOAVOID - Detected " & $failuresbeforereset & ", non matching squares in a row" & @CRLF & "Starting a new row..." ControlSetText("", $message, "static1", $new_message) $message = $new_message If $failuresbeforereset > 2 Then $failuresbeforereset = $failuresbeforereset - 1 $_number_of_errors = 0 $x = 1 Else $message = "AUTOAVOID - Square contents did not match original square" & @CRLF & "Skipping..." ControlSetText("", $message, "static1", $new_message) $_number_of_errors = $_number_of_errors + 1 EndIf Else If $coord = 0xFFFFFF Then SplashTextOn("Edge of screen", "WARNING!" & @CRLF & "AUTOAVOIDANCE has detected you are at the edge of the screen. Starting a new row...",-1,-1,400,50,1) Sleep(1000) SplashOff() $x = 1 Else MouseClick("left", $coord[0], $coord[1], 1, $mousespeed) MsgBox(0,"Working","line 109 is working...",.4) EndIf EndIfHere is the whole thing in case you need it expandcollapse popup#cs ---------------------------------------------------------------------------- AutoIt Version: 3.3.0.0 Author: Daniel Mohr Script Function: Clicks grid of squares with optional auto avoidance if target square doesn't reasonably match the first. #ce ---------------------------------------------------------------------------- HotKeySet("{esc}", "MyExit") HotKeySet("{f5}", "startpos") HotKeySet("{home}", "startpos") HotKeySet("{g}", "startpos") $yes = True $loop = True $exit = False ;this is an alternitive way to exit the loop when the esc button is pressed $startset = False ;this is so I know later that they set a start position $mousespeed = 1.3 ;make a slider for this later... $xrst = 9 ;this is just to make the compiler happy, it gets defined later when I press HOME $pos = MouseGetPos() $_number_of_errors = 0 $failuresbeforereset = 3 Global $pixelcheck Global $coord $ans = MsgBox(4, "AUTOAVOIDANCE?", "Enable AUTOAVOIDANCE?") If $ans = 6 Then $Autoavoidance = True If $ans = 7 Then $Autoavoidance = False $x = InputBox("columns?", "how many squares in top row?", 11) $y = InputBox("rows?", "how many squares in side row?", 20) ;on GUI make a checkbox to make autovoidance optional Func startpos() $pos = MouseGetPos() $startset = True ;so I know later that they set a start pos $xrst = $x $xx = $pos[0] $yy = $pos[1] $pixelcheck = PixelGetColor($pos[0], $pos[1]) ;$coord = PixelSearch($pos[0] - 3, $pos[1] - 3, $pos[0] + 3, $pos[1] + 3, $pixelcheck, 10) ; I pasted this here from xclicks() SplashTextOn("", "Start position set," & $pos[0] & ", " & $pos[1], 400, 20, 400, 100) Sleep(700) SplashOff() EndFunc ;==>startpos $pos = MouseGetPos() MsgBox(0, "define startin position", "press g to define starting swarue then hit OK to begin") $xx = $pos[0] $yy = $pos[1] yclicks() Func MyExit() SplashTextOn("", "Closing", "300", "50", "640", "400", 33, "Courier New", "20", "700") $exit = True Exit EndFunc ;==>MyExit Func yclicks() Do If $exit = True Then ExitLoop EndIf SplashTextOn("", "Press ESC to exit", "300", "30", "640", "0", 33, "Courier New", "20", "700") If $Autoavoidance = True Then xclicks() Else xclicks_no_autoavoidance() EndIf $x = $xrst ;resets x back to normal $xx = $xx + 25 ; shifts starting point down a row $yy = $yy + 12 ; shifts starting point down a row $pos[0] = $xx ; shifts starting point down a row $pos[1] = $yy ; shifts starting point down a row $y = $y - 1 Until $y = 0 EndFunc ;==>yclicks Func xclicks() Do If $exit = True Then ExitLoop $coord = PixelSearch($pos[0] - 3, $pos[1] - 3, $pos[0] + 3, $pos[1] + 3, $pixelcheck, 10) SplashOff() $message = "Now Clicking..." SplashTextOn("", $message, 400, 130, 400, 20, 1) If @error Then If $_number_of_errors = $failuresbeforereset Then $new_message = "AUTOAVOID - Detected " & $failuresbeforereset & ", non matching squares in a row" & @CRLF & "Starting a new row..." ControlSetText("", $message, "static1", $new_message) $message = $new_message If $failuresbeforereset > 2 Then $failuresbeforereset = $failuresbeforereset - 1 $_number_of_errors = 0 $x = 1 Else $message = "AUTOAVOID - Square contents did not match original square" & @CRLF & "Skipping..." ControlSetText("", $message, "static1", $new_message) $_number_of_errors = $_number_of_errors + 1 EndIf Else If $coord = 0xFFFFFF Then SplashTextOn("Edge of screen", "WARNING!" & @CRLF & "AUTOAVOIDANCE has detected you are at the edge of the screen. Starting a new row...",-1,-1,400,50,1) Sleep(1000) SplashOff() $x = 1 Else MouseClick("left", $coord[0], $coord[1], 1, $mousespeed) MsgBox(0,"Working","line 109 is working...",.4) EndIf EndIf $pos[0] = $pos[0] + 25 $pos[1] = $pos[1] - 12 $x = $x - 1 Until $x = 0 EndFunc ;==>xclicks Func xclicks_no_autoavoidance() Do If $exit = True Then ExitLoop MouseClick("left", $pos[0], $pos[1], 1, $mousespeed) $pos[0] = $pos[0] + 25 $pos[1] = $pos[1] - 12 $x = $x - 1 Until $x = 0 EndFunc ;==>xclicks_no_autoavoidance Link to comment Share on other sites More sharing options...
Moderators Melba23 Posted November 22, 2009 Moderators Share Posted November 22, 2009 danielmohr91,$coord = PixelSearch(......If PixelSearch fails, $coord is not an array - so $coord[0] & $coord[1] do not exist. Add some errorchecking to make sure $coord is an array before trying to use the elements $coord[0], $coord[1] in your MouseClick line.M23 Any of my own code posted anywhere on the forum is available for use by others without any restriction of any kind Open spoiler to see my UDFs: Spoiler ArrayMultiColSort ---- Sort arrays on multiple columnsChooseFileFolder ---- Single and multiple selections from specified path treeview listingDate_Time_Convert -- Easily convert date/time formats, including the language usedExtMsgBox --------- A highly customisable replacement for MsgBoxGUIExtender -------- Extend and retract multiple sections within a GUIGUIFrame ---------- Subdivide GUIs into many adjustable framesGUIListViewEx ------- Insert, delete, move, drag, sort, edit and colour ListView itemsGUITreeViewEx ------ Check/clear parent and child checkboxes in a TreeViewMarquee ----------- Scrolling tickertape GUIsNoFocusLines ------- Remove the dotted focus lines from buttons, sliders, radios and checkboxesNotify ------------- Small notifications on the edge of the displayScrollbars ----------Automatically sized scrollbars with a single commandStringSize ---------- Automatically size controls to fit textToast -------------- Small GUIs which pop out of the notification area Link to comment Share on other sites More sharing options...
IchBistTod Posted November 22, 2009 Share Posted November 22, 2009 in addition to what Melba23 said; checking for an array is as simple as using isarray() or checking for @error from pixelsearch. [center][/center][center]=][u][/u][/center][center][/center] Link to comment Share on other sites More sharing options...
danielmohr91 Posted November 22, 2009 Author Share Posted November 22, 2009 danielmohr91, $coord = PixelSearch(...... If PixelSearch fails, $coord is not an array - so $coord[0] & $coord[1] do not exist. Add some errorchecking to make sure $coord is an array before trying to use the elements $coord[0], $coord[1] in your MouseClick line. M23 Brilliant!! Thanks mate! That makes sense now. I actually had @error, and it was working. But then I added the splash text etc... in between. I guess @error has to be on the line directly below $coord = PixelSearch(... line. I switched the $coord = PixelSearch... to right above the If @error line and it's working beatiful now. I also read up on IsArray I the help file. Thank you both SO much! Link to comment Share on other sites More sharing options...
Moderators Melba23 Posted November 22, 2009 Moderators Share Posted November 22, 2009 danielmohr91,I guess @error has to be on the line directly below $coord = PixelSearch(...Spot on. Any command resets @error, so you have to check immediately after a command if you want to catch its error return. The only alternative is to use a variable to hold the value for later checking.M23 Any of my own code posted anywhere on the forum is available for use by others without any restriction of any kind Open spoiler to see my UDFs: Spoiler ArrayMultiColSort ---- Sort arrays on multiple columnsChooseFileFolder ---- Single and multiple selections from specified path treeview listingDate_Time_Convert -- Easily convert date/time formats, including the language usedExtMsgBox --------- A highly customisable replacement for MsgBoxGUIExtender -------- Extend and retract multiple sections within a GUIGUIFrame ---------- Subdivide GUIs into many adjustable framesGUIListViewEx ------- Insert, delete, move, drag, sort, edit and colour ListView itemsGUITreeViewEx ------ Check/clear parent and child checkboxes in a TreeViewMarquee ----------- Scrolling tickertape GUIsNoFocusLines ------- Remove the dotted focus lines from buttons, sliders, radios and checkboxesNotify ------------- Small notifications on the edge of the displayScrollbars ----------Automatically sized scrollbars with a single commandStringSize ---------- Automatically size controls to fit textToast -------------- Small GUIs which pop out of the notification area Link to comment Share on other sites More sharing options...
danielmohr91 Posted November 22, 2009 Author Share Posted November 22, 2009 danielmohr91,Spot on. Any command resets @error, so you have to check immediately after a command if you want to catch its error return. The only alternative is to use a variable to hold the value for later checking.M23Ok, thanks! I'm beginning to understand @error. And honestly, I'm very grateful for your help! I was clueless and had no idea what was wrong. It's people like you and IchBistTod that make this forum a great place. Link to comment Share on other sites More sharing options...
Recommended Posts
Create an account or sign in to comment
You need to be a member in order to leave a comment
Create an account
Sign up for a new account in our community. It's easy!
Register a new accountSign in
Already have an account? Sign in here.
Sign In Now