Jump to content
TheDcoder

AutoIt can't handle big data in arrays

Recommended Posts

TheDcoder

Hello everyone :bye:, I am currently having some problems with this cut out from my latest project:

The project is called Magic Number Calculator, Spoiler Alert!

#include <Array.au3>
#include <Debug.au3>

Global Const $eAutoItIncludesFolder = @ProgramFilesDir & "\AutoIt3\Include"
Global Const $eAVIConstantsFile = $eAutoItIncludesFolder & "\AVIConstants.au3"
Global Const $eButtonConstantsFile = $eAutoItIncludesFolder & "\ButtonConstants.au3"
Global Const $eComboConstantsFile = $eAutoItIncludesFolder & "\ComboConstants.au3"
Global Const $eDateTimeConstants = $eAutoItIncludesFolder & "\DateTimeConstants.au3"
Global Const $eEditConstantsFile = $eAutoItIncludesFolder & "\EditConstants.au3"
Global Const $eGUIConstantsExFile = $eAutoItIncludesFolder & "\GUIConstantsEx.au3"
Global Const $eListboxConstantsFile = $eAutoItIncludesFolder & "\ListboxConstants.au3"
Global Const $eListViewConstantsFile = $eAutoItIncludesFolder & "\ListViewConstants.au3"
Global Const $eWindowsConstantsFile = $eAutoItIncludesFolder & "\WindowsConstants.au3"

; Debug
_DebugSetup()
$aArray = LoadConstants($eAVIConstantsFile & '|' & $eButtonConstantsFile & '|' & $eComboConstantsFile & '|' & $eDateTimeConstants & '|' & $eEditConstantsFile & '|' & $eGUIConstantsExFile & '|' & $eListboxConstantsFile & '|' & $eListViewConstantsFile & '|' & $eWindowsConstantsFile)
_DebugOut("Returned")
_ArrayDisplay($aArray)

Func LoadConstants($sFile)
    $aFiles = StringSplit($sFile, '|') ; Load the list of files to load
    _DebugOut("Loaded list of files")
    Local $aReturn = LoadConstants($aFiles[1]) ; Load the first file
    _DebugOut("Loaded the first file")
    For $i = 2 To $aFiles[0] ; Load remaining files
        $aTempArray = ConstantFileTo2DArray($aFiles[$i]) ; Store the contants to concatenate
        _DebugOut("Loaded " & $i & " Files")
        _ArrayConcatenate($aReturn, $aTempArray)
        _DebugOut("Concatenated")
    Next
    _DebugOut("Returning")
    Return $aReturn ; Return the Array
EndFunc   ;==>LoadConstants

Func ConstantFileTo2DArray($sFile)
    $aFile = FileReadToArray($sFile)
    Local $sLinesToBeDeleted = "0;" ; Remove line.no 1 because it always contains #include-once
    For $i = 0 To UBound($aFile) - 1
        If StringLeft($aFile[$i], 1) = ';' Or $aFile[$i] = "" Then $sLinesToBeDeleted &= $i & ';' ; Detect if the present line is a comment or empty ;)
    Next
    $sLinesToBeDeleted = StringTrimRight($sLinesToBeDeleted, 1) ; Trim the last semi-colon
    _ArrayDelete($aFile, $sLinesToBeDeleted) ; Delete empty lines
    For $i = 0 To UBound($aFile) - 1
        $aFile[$i] = StringStripWS($aFile[$i], $STR_STRIPALL) ; Remove any Space, CR, LF etc. chars from the string (Refer to StringStipWS's documentation for more info)
        $aFile[$i] = StringTrimLeftUntil('$', $aFile[$i], 1, False) ; Remove any Global Const before the variable
        If Not StringInStr($aFile[$i], ';') = 0 Then $aFile[$i] = StringTrimRightUntil(';', $aFile[$i]) ; Remove any comments (For example, like this comment trailing after the function :P)
    Next
    Local $aReturn[UBound($aFile)][2]
    $sLinesToBeDeleted = ""
    For $i = 0 To UBound($aFile) - 1
        $aTempArray = StringSplit($aFile[$i], '=', $STR_NOCOUNT) ; Split the Variable & Value
        $aTempArray[0] = StringTrimLeft($aTempArray[0], 1) ; Trim the dollar sign
        Assign($aTempArray[0], $aTempArray[1], 1) ; Assign the constants as variables (forced in local scope) for solving them using execute()
        $aTempArray[1] = Execute($aTempArray[1])
        Assign($aTempArray[0], $aTempArray[1], 1) ; Assign the calculated value again
        $aReturn[$i][0] = '$' & $aTempArray[0]
        $aReturn[$i][1] = $aTempArray[1]
        If Not IsInt($aTempArray[1]) Then $sLinesToBeDeleted &= $i & ';' ; Delete constants which are not intergers
    Next
    _ArrayDelete($aReturn, StringTrimRight($sLinesToBeDeleted, 1)) ; Delete constants which are not intergers
    Return $aReturn
EndFunc   ;==>ConstantFileTo2DArray

Func StringTrimLeftUntil($sDelimiter, $sString, $iOccurrence = 1, $bTrimDelimiter = True)
    $iDelimiterLen = StringLen($sDelimiter)
    $sString = StringTrimLeft($sString, StringInStr($sString, $sDelimiter, 2, $iOccurrence) + ($iDelimiterLen - 1))
    If $bTrimDelimiter = False Then $sString = $sDelimiter & $sString
    Return $sString
EndFunc   ;==>StringTrimLeftUntil

Func StringTrimRightUntil($sDelimiter, $sString, $iOccurrence = 1, $bTrimDelimiter = True)
    $iStringLen = StringLen($sString)
    $iDelimiterLen = StringLen($sDelimiter)
    $iOccurrence -= $iOccurrence * 2
    $sString = StringTrimRight($sString, ($iStringLen - StringInStr($sString, $sDelimiter, 2, $iOccurrence)) - ($iDelimiterLen - 1) + $iDelimiterLen)
    If $bTrimDelimiter = False Then $sString &= $sDelimiter
    Return $sString
EndFunc   ;==>StringTrimRightUntil

 

The code looks good, but if you run it AutoIt crashes :(... Any tips or suggestion to make it work again :ermm:?

Here is the error image: http://img4.imagetitan.com/img.php?image=11_capture2866.png

SciTE Output (Exit code is not constant):

>"C:\Program Files (x86)\AutoIt3\SciTE\AutoIt3Wrapper\AutoIt3Wrapper.exe" /run /prod /ErrorStdOut /in "C:\Users\TheDcoder\Desktop\New AutoIt v3 Script.au3" /UserParams    
+>15:31:59 Starting AutoIt3Wrapper v.14.801.2025.0 SciTE v.3.4.4.0   Keyboard:00004009  OS:WIN_81/  CPU:X64 OS:X64    Environment(Language:0809)
+>         SciTEDir => C:\Program Files (x86)\AutoIt3\SciTE   UserDir => C:\Users\TheDcoder\AppData\Local\AutoIt v3\SciTE\AutoIt3Wrapper   SCITE_USERHOME => C:\Users\TheDcoder\AppData\Local\AutoIt v3\SciTE 
>Running AU3Check (3.3.12.0)  from:C:\Program Files (x86)\AutoIt3  input:C:\Users\TheDcoder\Desktop\New AutoIt v3 Script.au3
+>15:31:59 AU3Check ended.rc:0
>Running:(3.3.12.0):C:\Program Files (x86)\AutoIt3\autoit3.exe "C:\Users\TheDcoder\Desktop\New AutoIt v3 Script.au3"    
--> Press Ctrl+Alt+Break to Restart or Ctrl+Break to Stop
!>15:32:10 AutoIt3.exe ended.rc:-1073740771
+>15:32:10 AutoIt3Wrapper Finished.
>Exit code: 3221226525    Time: 12.07

Thanks in Advance, TD :D

Edited by TheDcoder
code correction

AutoIt.4.Life Clubrooms - Life is like a Donut (secret key)

Spoiler

My contributions to the AutoIt Community

If I have hurt or offended you in anyway, Please accept my apologies, I never (regardless of the situation) mean to do that to anybody!!!

3fHNZJ.gif

PLEASE JOIN ##AutoIt AND HELP THE IRC AUTOIT COMMUNITY!

Share this post


Link to post
Share on other sites
water

Yes: Please provide the error message you get so we know what the problem "exactly" is.

Edited by water

My UDFs and Tutorials:

Spoiler

UDFs:
Active Directory (NEW 2018-06-01 - Version 1.4.9.0) - Download - General Help & Support - Example Scripts - Wiki
OutlookEX (2018-01-27 - Version 1.3.3.1) - Download - General Help & Support - Example Scripts - Wiki
ExcelChart (2015-04-01 - Version 0.4.0.0) - Download - General Help & Support - Example Scripts
Excel - Example Scripts - Wiki
Word - Wiki
PowerPoint (2015-06-06 - Version 0.0.5.0) - Download - General Help & Support

Tutorials:
ADO - Wiki

 

Share this post


Link to post
Share on other sites
TheDcoder

@water Added debug details :)

 

P.S Is that code working for you?


AutoIt.4.Life Clubrooms - Life is like a Donut (secret key)

Spoiler

My contributions to the AutoIt Community

If I have hurt or offended you in anyway, Please accept my apologies, I never (regardless of the situation) mean to do that to anybody!!!

3fHNZJ.gif

PLEASE JOIN ##AutoIt AND HELP THE IRC AUTOIT COMMUNITY!

Share this post


Link to post
Share on other sites
water

P.S Is that code working for you?

No. On Windows 7 I get  "Loaded list of files" in the debug window over and over again until the script crashes.
After a quick glance at your code I think you are passing the wrong parameter.

Func LoadConstants($sFile)
    $aFiles = StringSplit($sFile, '|') ; Load the list of files to load
    _DebugOut("Loaded list of files")
    Local $aReturn = LoadConstants($sFile) ; Load the first file

should be

Func LoadConstants($sFile)
    $aFiles = StringSplit($sFile, '|') ; Load the list of files to load
    _DebugOut("Loaded list of files")
    Local $aReturn = LoadConstants($aFiles[1]) ; Load the first file

 


My UDFs and Tutorials:

Spoiler

UDFs:
Active Directory (NEW 2018-06-01 - Version 1.4.9.0) - Download - General Help & Support - Example Scripts - Wiki
OutlookEX (2018-01-27 - Version 1.3.3.1) - Download - General Help & Support - Example Scripts - Wiki
ExcelChart (2015-04-01 - Version 0.4.0.0) - Download - General Help & Support - Example Scripts
Excel - Example Scripts - Wiki
Word - Wiki
PowerPoint (2015-06-06 - Version 0.0.5.0) - Download - General Help & Support

Tutorials:
ADO - Wiki

 

Share this post


Link to post
Share on other sites
TheDcoder

@water :doh:Fixed it... But It didn't solve the problem :(


AutoIt.4.Life Clubrooms - Life is like a Donut (secret key)

Spoiler

My contributions to the AutoIt Community

If I have hurt or offended you in anyway, Please accept my apologies, I never (regardless of the situation) mean to do that to anybody!!!

3fHNZJ.gif

PLEASE JOIN ##AutoIt AND HELP THE IRC AUTOIT COMMUNITY!

Share this post


Link to post
Share on other sites
water

What do you now get in the debug window?


My UDFs and Tutorials:

Spoiler

UDFs:
Active Directory (NEW 2018-06-01 - Version 1.4.9.0) - Download - General Help & Support - Example Scripts - Wiki
OutlookEX (2018-01-27 - Version 1.3.3.1) - Download - General Help & Support - Example Scripts - Wiki
ExcelChart (2015-04-01 - Version 0.4.0.0) - Download - General Help & Support - Example Scripts
Excel - Example Scripts - Wiki
Word - Wiki
PowerPoint (2015-06-06 - Version 0.0.5.0) - Download - General Help & Support

Tutorials:
ADO - Wiki

 

Share this post


Link to post
Share on other sites
TheDcoder

@water Same repetition of "Loaded list of files" :(


AutoIt.4.Life Clubrooms - Life is like a Donut (secret key)

Spoiler

My contributions to the AutoIt Community

If I have hurt or offended you in anyway, Please accept my apologies, I never (regardless of the situation) mean to do that to anybody!!!

3fHNZJ.gif

PLEASE JOIN ##AutoIt AND HELP THE IRC AUTOIT COMMUNITY!

Share this post


Link to post
Share on other sites
water

Why do you recursively call LoadConstants?
Right now you call LoadConstants until the universe falls apart. You need to define a condition when to exit the recursion.


My UDFs and Tutorials:

Spoiler

UDFs:
Active Directory (NEW 2018-06-01 - Version 1.4.9.0) - Download - General Help & Support - Example Scripts - Wiki
OutlookEX (2018-01-27 - Version 1.3.3.1) - Download - General Help & Support - Example Scripts - Wiki
ExcelChart (2015-04-01 - Version 0.4.0.0) - Download - General Help & Support - Example Scripts
Excel - Example Scripts - Wiki
Word - Wiki
PowerPoint (2015-06-06 - Version 0.0.5.0) - Download - General Help & Support

Tutorials:
ADO - Wiki

 

Share this post


Link to post
Share on other sites
TheDcoder

Right now you call LoadConstants until the universe falls apart.

On which line :huh:?


AutoIt.4.Life Clubrooms - Life is like a Donut (secret key)

Spoiler

My contributions to the AutoIt Community

If I have hurt or offended you in anyway, Please accept my apologies, I never (regardless of the situation) mean to do that to anybody!!!

3fHNZJ.gif

PLEASE JOIN ##AutoIt AND HELP THE IRC AUTOIT COMMUNITY!

Share this post


Link to post
Share on other sites
water

In function LoadConstants you call LoadConstants you call LoadConstants you call LoadConstants you call LoadConstants you call LoadConstants you call LoadConstants ...


My UDFs and Tutorials:

Spoiler

UDFs:
Active Directory (NEW 2018-06-01 - Version 1.4.9.0) - Download - General Help & Support - Example Scripts - Wiki
OutlookEX (2018-01-27 - Version 1.3.3.1) - Download - General Help & Support - Example Scripts - Wiki
ExcelChart (2015-04-01 - Version 0.4.0.0) - Download - General Help & Support - Example Scripts
Excel - Example Scripts - Wiki
Word - Wiki
PowerPoint (2015-06-06 - Version 0.0.5.0) - Download - General Help & Support

Tutorials:
ADO - Wiki

 

Share this post


Link to post
Share on other sites
TheDcoder

@water :oops: Thanks! I used LoadConstants instead of ConvertConstantsTo2DArray

 

TD :)


AutoIt.4.Life Clubrooms - Life is like a Donut (secret key)

Spoiler

My contributions to the AutoIt Community

If I have hurt or offended you in anyway, Please accept my apologies, I never (regardless of the situation) mean to do that to anybody!!!

3fHNZJ.gif

PLEASE JOIN ##AutoIt AND HELP THE IRC AUTOIT COMMUNITY!

Share this post


Link to post
Share on other sites
water

Creative use of the ternary operator :)


My UDFs and Tutorials:

Spoiler

UDFs:
Active Directory (NEW 2018-06-01 - Version 1.4.9.0) - Download - General Help & Support - Example Scripts - Wiki
OutlookEX (2018-01-27 - Version 1.3.3.1) - Download - General Help & Support - Example Scripts - Wiki
ExcelChart (2015-04-01 - Version 0.4.0.0) - Download - General Help & Support - Example Scripts
Excel - Example Scripts - Wiki
Word - Wiki
PowerPoint (2015-06-06 - Version 0.0.5.0) - Download - General Help & Support

Tutorials:
ADO - Wiki

 

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

    • TrashBoat
      By TrashBoat
      So Im trying to make a simple 2d game and make some sort of collision detection so why not to make a 2 dimensional array but i have no clue how  to write it in multiple lines
      Global $map[5,5] = [0,0,0,0,0 _ [0,0,0,0,0 _ [0,0,0,0,0 _ [0,0,0,0,0 _ [0,0,0,0,0] something like this but it doesn't work
    • Zein
      By Zein
      #include "..\Include\Array.au3" #include "..\Include\File.au3" #include "..\Include\AutoItConstants.au3" Local $aRetArray Local $sFilePath = "n.csv" _FileReadToArray($sFilePath, $aRetArray, ",") ; _FileReadToArray($sFilePath, $aRetArray, $FRTA_COUNT, ",") _ArrayDisplay($aRetArray, "Original", Default, 8) The above code shows two versions of _FileReadToArray and both don't work as expected.
      The first one doesn't use the comma as a delimiter. (so I get a single column array)  I tried adding "Default" between $aRetArray and "," then it told me it had an incorrect number of parameters. 

      I looked again at the documentation:
       
      #include <File.au3> _FileReadToArray ( $sFilePath, ByRef $vReturn [, $iFlags = $FRTA_COUNT [, $sDelimiter = ""]] )
      And I with or without the flags params I should be getting a 2D array due to my file being a csv. 
      I then tried a regular flag, $FRTA_COUNT, and it tells me that I'm using a variable $FRTA_COUNT while it's not declared. Tried putting in 1 instead and it told me again, incorrect number of params. 

       
    • ternal
      By ternal
      Hi,
      Recently I have had the need to do a sort and then do a second sort while the item of the first sort stays the same ( double sorting , first on column x then while column x is the same sort column y).
      I did not put much efffort into error checking but so far I did not need it.
      For my applications so far it works perfectly however if someone is willing I want to test this extensivly.
      If anyone has big lists of random stuff to sort could you try this out please?
      #include <Array.au3> ; #FUNCTION# ==================================================================================================================== ; Name ..........: _ArraySort_Double ; Description ...: ; Syntax ........: _ArraySort_Double (Byref $array[, $first_index = Default[, $second_index = Default[, $ascending = Default]]]) ; Parameters ....: $array - 2d array to sort. ; $first_index - [optional] first column to sort. Default is 0. ; $second_index - [optional] second column to sort. Default is 1. ; $ascending - [optional] ascending/descending. Default is 1. ; Return values .: 1 if no errors occured , -1 if errors occured ; Author ........: Ternal ; Remarks .......: Needs excessive testing. ; Related .......: _arraysort() ; =============================================================================================================================== Func _ArraySort_Double (byref $array, $first_index = Default, $second_index = Default, $ascending = Default) Local $temp_value Local $counter = 1 If UBound($array, $UBOUND_DIMENSIONS) <> 2 Then MsgBox(0, "error", "error") return -1 EndIf If $first_index = Default Then $first_index = 0 If $second_index = Default Then $second_index = 1 If $ascending = Default Then $ascending = 1 _ArraySort($array, $ascending, 0, 0, $first_index); you can alter settings of primary sort here If @error Then MsgBox(0, "error", @error) return -1 EndIf $temp_value = $array[0][$first_index] For $x = 1 to UBound($array, 1) - 1 If Mod( $x, 10000) = 0 Then ConsoleWrite("at " & $x & " of a total : " & UBound($array, 1) & @CRLF) If $array[$x][$first_index] = $temp_value Then $counter+= 1 If $x = UBound($array, 1) - 1 Then; do last line here(if last line is not a new item) _ArraySort($array, $ascending, $x - $counter, $x, $second_index);you can alter settings of secondary sort here(don't forget to place line 34 the exact same) If @error Then MsgBox(0, "error", @error) return -1 EndIf EndIf Else If $counter > 0 Then ;at least 2 of the same _ArraySort($array, $ascending, $x - $counter, $x - 1, $second_index);you can alter settings of secondary sort here(don't forget to place line 29 the exact same) If @error Then MsgBox(0, "error", @error) return -1 EndIf $counter = 1 EndIf EndIf $temp_value = $array[$x][$first_index] Next Return 1 EndFunc Kind regards, Ternal
    • TrashBoat
      By TrashBoat
      So I've made this script that detects how long i have held down my left mouse button for and stores the information in an array and then sorts its using _ArraySort but the output is half sorted half broken.
      Here's my script:
      HotKeySet("{F1}","_exit") #include <Misc.au3> #include <Timers.au3> #include <Array.au3> Local $dll = DllOpen("user32.dll") $on = False Global $array[0] While(1) If _IsPressed(01,$dll) Then $timer = _Timer_Init() While _IsPressed(01,$dll) Sleep(1) WEnd $time = _Timer_Diff($timer) _ArrayAdd($array,"Time: " & Floor($time) & " ms") ;~ ConsoleWrite("Time: " & Floor($time) & " ms" & @CRLF) EndIf Sleep(50) WEnd Func _exit() _ArraySort($array) _ArrayDisplay($array) Exit EndFunc And the output:

      See how its not sorted?  What is the problem here?
    • MrCheese
      By MrCheese
      Hi guys,
      See attached for an array example.
      to simplify what i want to achieve,  I want to split this array into 9 different csv files.
      the first file would contain the list of "key" and the corresponding "ID1", the second would have "key" and the "ID2", the third would have "key" and "ID3"
      However, I want to remove all the rows that don't have an ID recorded in the respective ID2, ID3 4...5...6 etc, so the file only contains row items with a key and the ID.
      Would be the best way to loop through the rows and delete the row if the array field is blank - would I then need to repeat that row ID to check that the row that its replaced is also empty (ie the one after the one I just deleted)? I see this getting messy.
      or _arraySort, and delete everything below the last filled row? <-- this might be best?
      Or should I use the excel UDF, apply a filter (not selecting the blanks), then create/export to the array->csv?
       
      Super keen to hear your thoughts.
      thanks!
       
       
       
       
      IDArray.csv
×