Jump to content

Empty arrays


Digisoul
 Share

Recommended Posts

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

Link to comment
Share on other sites

  • Moderators

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

 

Link to comment
Share on other sites

This still works

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

My UDFs and Tutorials:

Spoiler

UDFs:
Active Directory (NEW 2022-02-19 - Version 1.6.1.0) - Download - General Help & Support - Example Scripts - Wiki
ExcelChart (2017-07-21 - Version 0.4.0.1) - Download - General Help & Support - Example Scripts
OutlookEX (2021-11-16 - Version 1.7.0.0) - Download - General Help & Support - Example Scripts - Wiki
OutlookEX_GUI (2021-04-13 - Version 1.4.0.0) - Download
Outlook Tools (2019-07-22 - Version 0.6.0.0) - Download - General Help & Support - Wiki
PowerPoint (2021-08-31 - Version 1.5.0.0) - Download - General Help & Support - Example Scripts - Wiki
Task Scheduler (NEW 2022-07-28 - Version 1.6.0.1) - Download - General Help & Support - Wiki

Standard UDFs:
Excel - Example Scripts - Wiki
Word - Wiki

Tutorials:
ADO - Wiki
WebDriver - Wiki

 

Link to comment
Share on other sites

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

Link to comment
Share on other sites

  • Moderators

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

 

Link to comment
Share on other sites

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
Link to comment
Share on other sites

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.

Link to comment
Share on other sites

  • Moderators

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

 

Link to comment
Share on other sites

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 2022-02-19 - Version 1.6.1.0) - Download - General Help & Support - Example Scripts - Wiki
ExcelChart (2017-07-21 - Version 0.4.0.1) - Download - General Help & Support - Example Scripts
OutlookEX (2021-11-16 - Version 1.7.0.0) - Download - General Help & Support - Example Scripts - Wiki
OutlookEX_GUI (2021-04-13 - Version 1.4.0.0) - Download
Outlook Tools (2019-07-22 - Version 0.6.0.0) - Download - General Help & Support - Wiki
PowerPoint (2021-08-31 - Version 1.5.0.0) - Download - General Help & Support - Example Scripts - Wiki
Task Scheduler (NEW 2022-07-28 - Version 1.6.0.1) - Download - General Help & Support - Wiki

Standard UDFs:
Excel - Example Scripts - Wiki
Word - Wiki

Tutorials:
ADO - Wiki
WebDriver - Wiki

 

Link to comment
Share on other sites

  • Moderators

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

 

Link to comment
Share on other sites

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)

Link to comment
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
 Share

×
×
  • Create New...