Jump to content

[Solved]Array.au3 error ?

Recommended Posts


Hey !

I was looking for an array display to see the result of StringSplit but when i called the <Array.au3>, an error is showing up when i try to launch the script.

I took a screenshoot of the windows dialog box error : imp.bmp

And when I look into the Array.au3 there is no error :

; I am the line 72
Func _ArrayAdd(ByRef $aArray, $vValue, $iStart = 0, $sDelim_Item = "|", $sDelim_Row = @CRLF, $iForce = $ARRAYFILL_FORCE_DEFAULT)

    If $iStart = Default Then $iStart = 0
    If $sDelim_Item = Default Then $sDelim_Item = "|"
    If $sDelim_Row = Default Then $sDelim_Row = @CRLF
    If $iForce = Default Then $iForce = $ARRAYFILL_FORCE_DEFAULT
    If Not IsArray($aArray) Then Return SetError(1, 0, -1)
    Local $iDim_1 = UBound($aArray, $UBOUND_ROWS)
    Local $hDataType = 0
    Switch $iForce
            $hDataType = Int
            $hDataType = Number
            $hDataType = Ptr
            $hDataType = Hwnd
            $hDataType = String
    Switch UBound($aArray, $UBOUND_DIMENSIONS)
        Case 1
            If $iForce = $ARRAYFILL_FORCE_SINGLEITEM Then
                ReDim $aArray[$iDim_1 + 1]
                $aArray[$iDim_1] = $vValue
                Return $iDim_1
            If IsArray($vValue) Then
                If UBound($vValue, $UBOUND_DIMENSIONS) <> 1 Then Return SetError(5, 0, -1)
                $hDataType = 0
                Local $aTmp = StringSplit($vValue, $sDelim_Item, $STR_NOCOUNT + $STR_ENTIRESPLIT)
                If UBound($aTmp, $UBOUND_ROWS) = 1 Then
                    $aTmp[0] = $vValue
                $vValue = $aTmp
            Local $iAdd = UBound($vValue, $UBOUND_ROWS)
            ReDim $aArray[$iDim_1 + $iAdd]
            For $i = 0 To $iAdd - 1
                If IsFunc($hDataType) Then
                    $aArray[$iDim_1 + $i] = $hDataType($vValue[$i])
                    $aArray[$iDim_1 + $i] = $vValue[$i]
            Return $iDim_1 + $iAdd - 1
        Case 2
            Local $iDim_2 = UBound($aArray, $UBOUND_COLUMNS)
            If $iStart < 0 Or $iStart > $iDim_2 - 1 Then Return SetError(4, 0, -1)
            Local $iValDim_1, $iValDim_2 = 0, $iColCount
            If IsArray($vValue) Then
                If UBound($vValue, $UBOUND_DIMENSIONS) <> 2 Then Return SetError(5, 0, -1)
                $iValDim_1 = UBound($vValue, $UBOUND_ROWS)
                $iValDim_2 = UBound($vValue, $UBOUND_COLUMNS)
                $hDataType = 0
                ; Convert string to 2D array
                Local $aSplit_1 = StringSplit($vValue, $sDelim_Row, $STR_NOCOUNT + $STR_ENTIRESPLIT)
                $iValDim_1 = UBound($aSplit_1, $UBOUND_ROWS)
                Local $aTmp[$iValDim_1][0], $aSplit_2
                For $i = 0 To $iValDim_1 - 1
                    $aSplit_2 = StringSplit($aSplit_1[$i], $sDelim_Item, $STR_NOCOUNT + $STR_ENTIRESPLIT)
                    $iColCount = UBound($aSplit_2)
                    If $iColCount > $iValDim_2 Then
                        ; Increase array size to fit max number of items on line
                        $iValDim_2 = $iColCount
                        ReDim $aTmp[$iValDim_1][$iValDim_2]
                    For $j = 0 To $iColCount - 1
                        $aTmp[$i][$j] = $aSplit_2[$j]
                $vValue = $aTmp
            ; Check if too many columns to fit
            If UBound($vValue, $UBOUND_COLUMNS) + $iStart > UBound($aArray, $UBOUND_COLUMNS) Then Return SetError(3, 0, -1)
            ReDim $aArray[$iDim_1 + $iValDim_1][$iDim_2]
            For $iWriteTo_Index = 0 To $iValDim_1 - 1
                For $j = 0 To $iDim_2 - 1
                    If $j < $iStart Then
                        $aArray[$iWriteTo_Index + $iDim_1][$j] = ""
                    ElseIf $j - $iStart > $iValDim_2 - 1 Then
                        $aArray[$iWriteTo_Index + $iDim_1][$j] = ""
                        If IsFunc($hDataType) Then
                            $aArray[$iWriteTo_Index + $iDim_1][$j] = $hDataType($vValue[$iWriteTo_Index][$j - $iStart])
                            $aArray[$iWriteTo_Index + $iDim_1][$j] = $vValue[$iWriteTo_Index][$j - $iStart]
        Case Else
            Return SetError(2, 0, -1)

    Return UBound($aArray, $UBOUND_ROWS) - 1

EndFunc   ;==>_ArrayAdd
; As you can see above, there is a EndFunc for ArrayAdd


Why is it doing this ?

Edited by hcI
Problem solved itself when creating a new autoit file and copy paste the code into

Share this post

Link to post
Share on other sites

The error makes me believe that something prior to this line is the cause.  Since that line start with Func, something before that line is causing the issue.  Can you share more of the script?  Also, did you extract functions from the Array.au3 UDF, or are you just including it.   Scratch, that....I'm willing to wager you are including it..._Array_Add is the first function in the UDF.

We need more info to go on.  I use the Array.au3 UDF all of the time and never have this issue, so it must be something inherit with the rest of your script.

Edited by spudw2k

Share this post

Link to post
Share on other sites
Func IsUTD ( $URL, $fileName, $vActual ="")
    #include <InetConstants.au3>
    #include <Array.au3>
    Local $UpdateNeeded[2] = [0, ""]
    Local $iFileInfo = InetGet ( $URL, @TempDir & "\" & $fileName, $INET_FORCEBYPASS )
    Local $iFileContent = FileOpen(@TempDir & "\" & $fileName)
    Local $iLink = FileReadLine($iFileContent, 2)
    Local $OnlineVersion = StringSplit(FileReadLine($iFileContent, 1), ".")
    Local $ActualVersion = StringSplit($vActual, ".")
    _ArrayDisplay($OnlineVersion, "Online")
    _ArrayDisplay($ActualVersion, "Actual")
    If $OnlineVersion[1] > $ActualVersion[1] Then $UpdateNeeded[0] = 1
    If $OnlineVersion[2] > $ActualVersion[2] Then $UpdateNeeded[0] = 1
    If $OnlineVersion[3] > $ActualVersion[3] Then $UpdateNeeded[0] = 1
    If $OnlineVersion[4] > $ActualVersion[4] Then $UpdateNeeded[0] = 1
    If $UpdateNeeded[0] = 1 Then $UpdateNeeded[1] = $iLink
    Return $UpdateNeeded

I'm making an UDF to check if the script is Up To Date

If you want to know, the file that i'm getting with InetGet contain the following :


Share this post

Link to post
Share on other sites

The issue is you are including the Array UDF within your function.  So basically what is happening is your Func is followed by another Func inside the Array.au3 UDF, before you function is "closed" (EndFunc).   Move your includes to the beginning of the script.  That should fix your issue.

Edited by spudw2k

Share this post

Link to post
Share on other sites

It works too but the problem just solved itself when creating a new AutoIt file and copy-paste the code into it..

Thanks anyway !



Share this post

Link to post
Share on other sites


As the standard includes all have #include-once as the first line that will not happen.

The problem is as spudw2k pointed out earlier - you cannot define functions within other functions, so I am somewhat surprised by the OP saying it worked after resaving in a new file.


Any of my own code posted anywhere on the forum is available for use by others without any restriction of any kind._______My UDFs:


ArrayMultiColSort ---- Sort arrays on multiple columns
ChooseFileFolder ---- Single and multiple selections from specified path treeview listing
Date_Time_Convert -- Easily convert date/time formats, including the language used
ExtMsgBox --------- A highly customisable replacement for MsgBox
GUIExtender -------- Extend and retract multiple sections within a GUI
GUIFrame ---------- Subdivide GUIs into many adjustable frames
GUIListViewEx ------- Insert, delete, move, drag, sort, edit and colour ListView items
GUITreeViewEx ------ Check/clear parent and child checkboxes in a TreeView
Marquee ----------- Scrolling tickertape GUIs
NoFocusLines ------- Remove the dotted focus lines from buttons, sliders, radios and checkboxes
Notify ------------- Small notifications on the edge of the display
Scrollbars ----------Automatically sized scrollbars with a single command
StringSize ---------- Automatically size controls to fit text
Toast -------------- Small GUIs which pop out of the notification area


Share this post

Link to post
Share on other sites
2 hours ago, Melba23 said:

... I am somewhat surprised by the OP saying it worked after resaving in a new file.

Agreed, unless he put both the includes at the top of the script and in the function (thinking about the include-once directive).

But yes, the point is function cannot be inside other functions.

Edited by spudw2k

Share this post

Link to post
Share on other sites

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 account

Sign in

Already have an account? Sign in here.

Sign In Now

  • Similar Content

    • NizonRox
      By NizonRox
      Hi, i'm currently facing problems with understanding how arrays work, or atleast a few commands that alter arrays.
      My current situation is:
      1. I'm taking the process list and putting it all in an array
      2. I want to remove the boring common windows processes
      3. Profit
      And i'm currently stuck on step 2, while i already found this thread it dosn't seem that i can make it do what i want.
      Current code:
      Local $PList = ProcessList() Local $RL[6] = ["smss.exe", "csrss.exe", "svchost.exe", "iexplore.exe", "chrome.exe", "conhost.exe"] Sleep(1) For $i=1 To Ubound($RL)-1 Sleep(1) While Not @Error $iIndex = _ArraySearch($PList, $RL[$i], 1, 0, 0, 1) _ArrayDelete($PList, $iIndex) WEnd Next It seems to remove all but smss.exe from the array list unless i have it two times in the array.
      Note: The sleep(1) is there to clear the error else the command wont fire for the rest of the array, any other way of doing it?
    • Randwulf
      By Randwulf
      To save myself a "search" nightmare, I'm trying to wrap my head around 3D arrays.
      Example: In "No Limit Hold'em", if I only play kings "KK" and queens "QQ"
      and I only play them from the positions of the "Button" or "Blinds"
      and do one thing if it's raised ahead or another if not raised.
      I know that this example would be simple as a 2D array but if I'm dealing with 77 possible hands in 9 possible positions and 6 possible conditions then I'm dealing with almost 700 data lines.
      Lastly, if I have a variables to represent the hand like $hand = "QQ"
      and $position = "Button" and $ahead = "Raised", could the 3D array simplify my search, or should I just stick to the 2D array ??
      Thank you in advance for any thoughts...
    • Ascer
      By Ascer
      1. Description.
      Udf working with MSDN System.Collections.ArrayList. Allow you to make fast operations on huge arrays, speed is even x10 better than basic _ArrayAdd.  Not prefered for small arrays < 600 items. 2. Requirements
      .NET Framework 1.1 - 4.5 (on this version Microsoft destroy old rules) System Windows 3. Possibilities.
      ;=============================================================================================================== ; UDF Name: List.au3 ; ; Date: 2018-02-17, 10:52 ; Description: Simple udf to create System Collections as ArrayList and make multiple actions on them. ; ; Function(s): _ListCreate -> Creates a new list ; _ListCapacity -> Gets a list size in bytes ; _ListCount -> Gets items count in list ; _ListIsFixedSize -> Get bool if list if fixed size ; _ListIsReadOnly -> Get bool if list is read only ; _ListIsSynchronized -> Get bool if list is synchronized ; _ListGetItem -> Get item on index ; _ListSetItem -> Set item on index ; ; _ListAdd -> Add item at end of list ; _ListClear -> Remove all list items ; _ListClone -> Duplicate list in new var ; _ListContains -> Get bool if item is in list ; _ListGetHashCode -> Get hash code for list ; _ListGetRange -> Get list with items between indexs ; _ListIndexOf -> Get index of item ; _ListInsert -> Insert a new item on index ; _ListInsertRange -> Insert list into list on index ; _ListLastIndexOf -> Get index last of item ; _ListRemove -> Remove first found item ; _ListRemoveAt -> Remove item in index ; _ListRemoveRange -> Remove items between indexs ; _ListReverse -> Reverse all items in list ; _ListSetRange -> Set new value for items in range ; _ListSort -> Sort items in list (speed of reading) ; _ListToString -> Get list object name ; _ListTrimToSize -> Remove unused space in list ; ; Author(s): Ascer ;=============================================================================================================== 4. Downloads
      List.au3 5. Examples
      SpeedTest _ArrayAdd vs ListAdd SpeedTest ArraySearch vs ListIndexOf Basic usage - crating guild with members  
    • ronmage
      By ronmage
      So I have a loop that keeps reading data from an array and searching it for the same value. If the value is no there it does work then adds the value to the array to prevent it from doing the same work.
      If _ArraySearch($ID,$filearray[$i]) = -1 Then Work.... _ArrayAdd($ID,$filearray[$i]) EndIf This is in a for loop hence $i
      So what is happening is the code works great for several hours. After a period of time _ArraySearch($ID,$filearray[$i]) will result in -1 even if $ID = $filearray. So it ready as if there is no data in the array. Anyone have this problem? 
      Also I am just running in using F5 not compiling it and running it if that makes a difference.
    • FMS
      By FMS
      I'm trying to read a binary file to an array but couln't get it to work.
      Also I coul not find any help in the forum around this subject whish was helpfull.
      Is there any way it could be done?
      I tried a lot of ways but maybe somebody know's the right way?
      #AutoIt3Wrapper_Au3Check_Parameters=-d -w 1 -w 2 -w 3 -w 4 -w 5 -w 6 -w 7 #include <File.au3> #include <Array.au3> #include <AutoItConstants.au3> Local $in=FileOpen("TEST_labels.idx1-ubyte",16) ; 16+0=Read binary Local $data = FileRead($in) Local $FileArray = BinaryToString($data,4) ;~ $FileArray = StringSplit($BinarydData, @CRLF, 1+2) ;~ Local $FileArray = StringRegExp($BinarydData, "[^\r\n]+", 3) FileClose($in) _ArrayDisplay($FileArray,"$FileArray","",32) MsgBox($MB_SYSTEMMODAL, "", "$FileArray = " & $FileArray )  

Important Information

We have placed cookies on your device to help make this website better. You can adjust your cookie settings, otherwise we'll assume you're okay to continue.