Jump to content
Sign in to follow this  
Digisoul

Empty arrays

Recommended Posts

Digisoul

Hello,

I wrote a script where I was using empty Arrays like below:

Func SomeFunc()
Local $Array[]
;do something with array
EndFunc

and the script was working perfectly, but now AutoIt is giving error:

>Running AU3Check (3.3.11.2)  from:C:\Program Files (x86)\AutoIt3
+>21:05:40 AU3Check ended.rc:0
>Running:(3.3.11.2):C:\Program Files (x86)\AutoIt3\autoit3.exe "C:\Users\Digi\Desktop\test.au3"    
--> Press Ctrl+Alt+F5 to Restart or Ctrl+Break to Stop
"C:\Users\Digi\Desktop\test.au3" (7) : ==> Variable subscript badly formatted.:
Global $aTable[]
Global $aTable[^ ERROR
->21:05:40 AutoIt3.exe ended.rc:1
>Exit code: 1    Time: 0.310 

I want to confirm that, Empty Arrays are removed from new AutoIt version ?


73 108 111 118 101 65 117 116 111 105 116

Share this post


Link to post
Share on other sites
Melba23

Digisoul,

No AutoIt still has empty arrays, but if you do not assign values to the array when you create it you need to explicitly define the size of the dimensions:

#include <Array.au3>
#include <MsgBoxConstants.au3>
#include <AutoItConstants.au3>

Global $aArray[]= [1] ; Implicit sizing
MsgBox($MB_SYSTEMMODAL, "Size", "Array has " & UBound($aArray, $UBOUND_ROWS) & " items")

_ArrayDelete($aArray, 0)
MsgBox($MB_SYSTEMMODAL, "Size", "Array has " & UBound($aArray, $UBOUND_ROWS) & " items")

_ArrayAdd($aArray, 1)
MsgBox($MB_SYSTEMMODAL, "Size", "Array has " & UBound($aArray, $UBOUND_ROWS) & " items")

Global $aArray[0] ; Explicit sizing
MsgBox($MB_SYSTEMMODAL, "Size", "Array has " & UBound($aArray, $UBOUND_ROWS) & " items")
All clear? :)

M23


Public_Domain.png.2d871819fcb9957cf44f4514551a2935.png 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 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
water

This still works

Global $aArray[0]
ConsoleWrite(UBound($aArray, 1) & @LF)

My UDFs and Tutorials:

Spoiler

UDFs:
Active Directory (NEW 2018-12-03 - Version 1.4.11.0) - Download - General Help & Support - Example Scripts - Wiki
OutlookEX (2018-10-31 - Version 1.3.4.1) - Download - General Help & Support - Example Scripts - Wiki
ExcelChart (2017-07-21 - Version 0.4.0.1) - Download - General Help & Support - Example Scripts
PowerPoint (2017-06-06 - Version 0.0.5.0) - Download - General Help & Support
Excel - Example Scripts - Wiki
Word - Wiki
 
Tutorials:

ADO - Wiki

 

Share this post


Link to post
Share on other sites
Digisoul

Digisoul,

No AutoIt still has empty arrays, but if you do not assign values to the array when you create it you need to explicitly define the size of the dimensions:

#include <Array.au3>
#include <MsgBoxConstants.au3>
#include <AutoItConstants.au3>

Global $aArray[]= [1] ; Implicit sizing
MsgBox($MB_SYSTEMMODAL, "Size", "Array has " & UBound($aArray, $UBOUND_ROWS) & " items")

_ArrayDelete($aArray, 0)
MsgBox($MB_SYSTEMMODAL, "Size", "Array has " & UBound($aArray, $UBOUND_ROWS) & " items")

_ArrayAdd($aArray, 1)
MsgBox($MB_SYSTEMMODAL, "Size", "Array has " & UBound($aArray, $UBOUND_ROWS) & " items")

Global $aArray[0] ; Explicit sizing
MsgBox($MB_SYSTEMMODAL, "Size", "Array has " & UBound($aArray, $UBOUND_ROWS) & " items")
All clear? :)

M23

 

 

 

This still works

Global $aArray[0]
ConsoleWrite(UBound($aArray, 1) & @LF)

Thanks for your reply, I am not exactly sure but I remember that in one of the beta I was able to operate like:

Global $array[]
For $x = 0 to 99
 $array[$x] = $x
Next

But I got the correct syntax and operation of array.


73 108 111 118 101 65 117 116 111 105 116

Share this post


Link to post
Share on other sites
Melba23

Digisoul,

That was an undocumented feature that was tested in some of the Beta releases but has since been removed. It might or might not return in the future but for now it is not valid and the correct syntax is as I showed above. :)

M23


Public_Domain.png.2d871819fcb9957cf44f4514551a2935.png 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 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
FaridAgl

What about this one:

Global $aArray = []
ConsoleWrite(VarGetType($aArray) & @CRLF) ;Array
ConsoleWrite(UBound($aArray) & @CRLF) ;1

You can access the first (and the last) offset like this:

ConsoleWrite($aArray[0] & @CRLF)

And remember this is not valid:

Global $aArray[0]
ConsoleWrite(VarGetType($aArray) & @CRLF) ;Array
ConsoleWrite(UBound($aArray) & @CRLF) ;0
ConsoleWrite($aArray[0] & @CRLF) ;Error 

Because an array length should logically be at least 1, as an zero length array makes no sense.

It's look like you create a variable which you can't access it.

So an array with the minimum length (1) is just like a normal variable.

That's because of the memory stuff.

In a programming language with multiple datatypes, each datatype has its own length, for example an int variable in c++ is 4 byte length.

When you create an int array like Array[2], you are saying you want 2 * (sizeof(datatype)) bytes to be allocated to the created array.

If the start address of the allocation in the memory be 100 (For example), when you say Array[0], you are saying 100 + (0 * sizeof(datatype)) which is equal to 100, and when you say Array[1] it should be 104 as the datatype is int in this example.

Now think logically, what does an array with a length of 0 could mean?

Edited by D4RKON3

Share this post


Link to post
Share on other sites
jaberwacky

It looks to me like you've still indicated that address 100 should still be something.  Ambiguous, could be anything of any size until at such point you've indicated to set aside some amount of memory starting at 100.

Share this post


Link to post
Share on other sites
FaridAgl

I didn't get what you are trying to say, but I'm saying $Array[0] doesn't make any sense.

Share this post


Link to post
Share on other sites
Melba23

D4RKON3,

If I remember correctly it was introduced last summer - I amended the Array.au3 library so that it worked with empty arrays. There had been many discussions about whether AutoIt should allow such a thing - search around the forum to find the discussions - usually ended abruptly by the same person. ;)

One of the major advantages to my eyes is that you can do what I did in the example code above - use ArrayAdd/Delete and not have to worry whether there are actually any elements in the array. Before empty arrays existed, removing the final element destroyed the array - then adding another item meant checking if the variable was an array and redeclaring it if it was not. So I do not agree that empty arrays make no sense. :)

M23


Public_Domain.png.2d871819fcb9957cf44f4514551a2935.png 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 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
water

There are some UDFs out there that query data sources (AD, Excel ...) if the query string doesn't find any data it is sensible to return an empty array to the calling script.


My UDFs and Tutorials:

Spoiler

UDFs:
Active Directory (NEW 2018-12-03 - Version 1.4.11.0) - Download - General Help & Support - Example Scripts - Wiki
OutlookEX (2018-10-31 - Version 1.3.4.1) - Download - General Help & Support - Example Scripts - Wiki
ExcelChart (2017-07-21 - Version 0.4.0.1) - Download - General Help & Support - Example Scripts
PowerPoint (2017-06-06 - Version 0.0.5.0) - Download - General Help & Support
Excel - Example Scripts - Wiki
Word - Wiki
 
Tutorials:

ADO - Wiki

 

Share this post


Link to post
Share on other sites
FaridAgl

So, is it just another of the AutoIt's magics which shows up from the AutoIt's mystery box or it's also available on major programming languages like C++, Java or C#?

If yes, then I'm sorry because I never heard about it.

Share this post


Link to post
Share on other sites
Melba23

D4RKON3,

I seem to remember from those previously mentioned discussions that some other languages do indeed have this functionality. They were good reads - it is worth searching for them. ;)

M23


Public_Domain.png.2d871819fcb9957cf44f4514551a2935.png 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 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
jchd

Many languages allow for empty arrays, even if sometimes under a crude form. There is nothing shocking about an empty container. The empty set is crucial in set theory - and in mathematics in general. A linked list or a list can obviously be empty. An array is just another arrangement of things.


This wonderful site allows debugging and testing regular expressions (many flavors available). An absolute must have in your bookmarks.
Another excellent RegExp tutorial. Don't forget downloading your copy of up-to-date pcretest.exe and pcregrep.exe here
RegExp tutorial: enough to get started
PCRE v8.33 regexp documentation latest available release and currently implemented in AutoIt beta.

SQLitespeed is another feature-rich premier SQLite manager (includes import/export). Well worth a try.
SQLite Expert (freeware Personal Edition or payware Pro version) is a very useful SQLite database manager.
An excellent eBook covering almost every aspect of SQLite3: a must-read for anyone doing serious work.
SQL tutorial (covers "generic" SQL, but most of it applies to SQLite as well)
A work-in-progress SQLite3 tutorial. Don't miss other LxyzTHW pages!
SQLite official website with full documentation (may be newer than the SQLite library that comes standard with AutoIt)

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
Sign in to follow this  

  • Similar Content

    • lattey
      By lattey
      hi,
      i have checkboxes and each checkbox that checked, i put in array. 
      now, im stuck on how to loop the checked array and store in in one variable. what i can do now, is only write the result into a text file. 
      below is the code:
      #include <GUIConstantsEx.au3> ;~ #include <MsgBoxConstants.au3> #include <ButtonConstants.au3> #include <Array.au3> Global $Count = 3 Global $CheckBoxP[$Count] Global $step[$Count] global $array1[1] Global $ExitResult $hGUI = GUICreate("Summary Steps", 500, 400) GUISetFont(12, 400, "Tahoma") GUICtrlCreateLabel( "Please Select the Summary Steps for Script Check", 70, 20) GUISetFont(10, 400, "Tahoma") Global $array_Pstep[3] = ["fix2","fix1","fix3"] global $step[3] = ["2","3","4"] $Spacing = 50 For $i = 0 To UBound($array_Pstep) - 1 $CheckBoxP[$i] = GUICtrlCreateCheckbox($array_Pstep[$i], 80, $Spacing + (20 * $i), 65, 17) Next $submit = GUICtrlCreateButton("Submit",180, 280, 80, 30) $exit = GUICtrlCreateButton("Exit",180, 320, 80, 30) GUISetState() While 1 $Msg = GUIGetMsg() Select case $Msg=$submit For $i = 0 To $Count - 1 If GUICtrlRead($CheckBoxP[$i]) = $GUI_CHECKED Then _ArrayAdd($array1, $step[$i]) EndIf Next Global $logfilerray = @WorkingDir & "\checkedlist.txt" FileDelete ($logfilerray) Global $readlogfile = FileOpen($logfilerray,1) for $a = 1 to UBound($array1) - 1 ;~ $var=$array1[$a] FileWriteLine($readlogfile,$array1[$a]) Next FileClose($readlogfile) Exit case $Msg=$exit $ExitResult = MsgBox(1,"Summary Step", "Continue to Exit ?") if $ExitResult = 1 Then ;ok Exit EndIf Exit EndSelect WEnd  
    • omicron
      By omicron
      How do you perform a nested loop function with a multidimensional array from 2 lists.
      for i in list1
      (open file) extract variable
          while open for i in list 2
          (open file2) extract variable
       
      var1 + var2 = (search term)

      The list sizes will more than likely consist of different lengths.
       
      What is the best approach to accomplishing this method?
             
    • omicron
      By omicron
      Hello!

      I am working on a function that I am just getting lost on. The goal is a multiple nested loop.

      Here are the steps:
      Contents of file1.txt::
      [topic] var1=Name var2=OtherName var3=SomeotheName Contents of file2.txt::
      [subTopic] top=sub1 top2=sub2 top3=sub3 The Shell I am working from::
      #include <file.au3> $file = "c:\yourfile.txt" FileOpen($file, 0) For $i = 1 to _FileCountLines($file) $line = FileReadLine($file, $i) msgbox(0,'','the line ' & $i & ' is ' & $line) Next FileClose($file) Understanding however that the "msgbox" needs to then become a variable. in example the following::
      $file = "c:\yourfile.txt" FileOpen($file, 0) While true( prog.exe is running && "WinName" is open) do For $i = 1 to _FileCountLines($file) $line = FileReadLine($file, $i) ;Open File to log "current location of file 1" FileWriteLine ("filename", $i & ' is ' & $line) var = $line Next $file2 = "c:\yourfile.txt" FileOpen($file, 0) For $i = 1 to _FileCountLines($file) $line = FileReadLine($file, $i) ; OpenFile to log "Current location of file 2" FileWriteLine ("filename", $i & ' is ' & $line) Next FileClose($file2) FileClose($file) The goal in written form is the following ::

      While in "OpenWindow"
          read from file 1 starting at line 1 until end of file.
         file 1 is a list of names to be searched.
         With $line selected, add this element to the element in file 2.
       
      The search of a variables in list 1 and list 2 differ on the amount of posts that day. (This is not a web based platform, it is a game) I need to search 2 names and take a screenshot of the out put. The sizes of the names list depend on the activity of names at the time of search.
      This loop continues until all the names from both lists have been searched. Mostly in the format of::
      File1= item
      File2= Vendor
       
      Item + Vendor  ( Capture screen, scroll) -- Not sure how to detect if I need to scroll)
       
      Thank you for your help and support!
    • Skeletor
      By Skeletor
      Hi Virtual People,
      My array works perfectly fine. However, what is the best practice if the line in the array doesn't have the correct amount of columns and if I can add a placeholder?

       
      For $count = 1 To _FileCountLines($FileRead1) Step 1 $string = FileReadLine($FileRead1, $count) $input = StringSplit($string, ",", 1) $value1 = $input[1] $value2 = $input[2] $value3 = $input[3] _Excel_RangeWrite($oWorkbook, $oWorkbook.Activesheet, $value2, "A1") _Excel_RangeWrite($oWorkbook, $oWorkbook.Activesheet, $value1, "B1") _Excel_RangeWrite($oWorkbook, $oWorkbook.Activesheet, $value3, "C1") Next  
    • MrCheese
      By MrCheese
      hi all,
      reviewing the forum, this thread is applicable: 
       
       
      I wanted to know if there is now a better way to do this?
      In essence, I load a tab delimited txt file into an array (works well). I used tab, as some fields in the original csv contains commas.
      However, I needed autoit to manipulate this array, and output it as a csv.
      IF my array contains items with a comma, without double quotes around the field, then how best do I get a csv out of this?
      My current workaround is to filewritefromarray tab delimited, then open it in excel and save as a csv. I will need to check this to see how the address fields behave that contain a comma.
       
      Any thoughts would be appreciated.
       
×