Jump to content
jmp

Error: array variable has incorrect number of subscripts or subscript dimension range exceeded

Recommended Posts

Script running good but error in line 7.

When i run this script :

#include <IE.au3>
#include <Array.au3>
$oIE = _IEAttach ("Shop")
$oTable = _IETableGetCollection ($oIE, 1)
$aTableData = _IETableWriteToArray ($oTable)
For $inumber = 1 To UBound($aTableData) -1
    $table = $aTableData[4][$inumber]
    MsgBox(0, "", $table)
Next

I got Error: array variable has incorrect number of subscripts or subscript dimension range exceeded

Edited by jmp
added -1 after ubond

Share this post


Link to post
Share on other sites

Without having had a close look it is 99.99999% of the time that it is a zero based array and the Ubound() returns the number of items, so the last item is the Ubound() value-1.

Jos

Share this post


Link to post
Share on other sites
1 minute ago, Jos said:

Without having had a close look it is 99.99999% of the time that it is a zero based array and the Ubound() returns the number of items, so the last item is the Ubound() value-1.

Jos

@Jos I added -1 after Ubond, But getting same error

Share this post


Link to post
Share on other sites

Then the other option could be that the  _IETableWriteToArray ($oTable) statement is failing to create the array and you aren't testing for it's success.
Add some error checking and debugging to your code and you will find the issue. ;) 

Jos

Share this post


Link to post
Share on other sites
6 minutes ago, jmp said:

$table = $aTableData[4][$inumber]

Maybe you are confusing rows and columns?
Reverse the 4 with $inumber, and see what happen, and, as @Jos suggested, do some error checking (an _ArrayDisplay too) :)


Click here to see my signature:

Spoiler

Thoughts:

  • I will always thank you for the time you spent for me.
    I'm here to ask, and from your response, I'd like to learn.
    By my knowledge, I can help someone else, and "that someone" could help in turn another, and so on.

/*--------------------------------------------------------------------------------------------------------------------------------------------------------------------------*/

ALWAYS GOOD TO READ:

 

Share this post


Link to post
Share on other sites
Just now, FrancescoDiMuro said:

Maybe you are confusing rows and columns?
Reverse the 4 with $inumber, and see what happen, and, as @Jos suggested, do some error checking (an _ArrayDisplay too) :)

@FrancescoDiMuro After Reverse the 4 with $inumber i am not getting any error, But i want to read all column of fourth row.

Share this post


Link to post
Share on other sites

@jmp
So you have to use the flag $UBOUND_COLUMNS in the UBound() function in your For loop, or it will go from the first row to the latest, and not the column :)


Click here to see my signature:

Spoiler

Thoughts:

  • I will always thank you for the time you spent for me.
    I'm here to ask, and from your response, I'd like to learn.
    By my knowledge, I can help someone else, and "that someone" could help in turn another, and so on.

/*--------------------------------------------------------------------------------------------------------------------------------------------------------------------------*/

ALWAYS GOOD TO READ:

 

Share this post


Link to post
Share on other sites
2 minutes ago, FrancescoDiMuro said:

@jmp
So you have to use the flag $UBOUND_COLUMNS in the UBound() function in your For loop, or it will go from the first row to the latest, and not the column :)

@FrancescoDiMuro Added, But getting same error

#include <IE.au3>
#include <Array.au3>
$oIE = _IEAttach ("Shop")
$oTable = _IETableGetCollection ($oIE, 1)
$aTableData = _IETableWriteToArray ($oTable)
For $inumber = 1 To UBound($aTableData, $UBOUND_COLUMNS) -1
    $table = $aTableData[4][$inumber]
    MsgBox(0, "", $table)
Next

 

Share this post


Link to post
Share on other sites

@jmp

Quote

as @Jos suggested, do some error checking (an _ArrayDisplay too) :)

 


Click here to see my signature:

Spoiler

Thoughts:

  • I will always thank you for the time you spent for me.
    I'm here to ask, and from your response, I'd like to learn.
    By my knowledge, I can help someone else, and "that someone" could help in turn another, and so on.

/*--------------------------------------------------------------------------------------------------------------------------------------------------------------------------*/

ALWAYS GOOD TO READ:

 

Share this post


Link to post
Share on other sites

@FrancescoDiMuro, @Jos

i am asking here another question.

How can i find smallest/highest number from this

#include <IE.au3>
#include <Array.au3>
$oIE = _IEAttach ("Shop")
$oTable = _IETableGetCollection ($oIE, 1)
$aTableData = _IETableWriteToArray ($oTable)
For $inumber = 1 To UBound($aTableData, 0)
    $table = $aTableData[4][$inumber]
    $iTwo = StringLeft ($table, 2) ; i found all number using it
    MsgBox(0, "", $iTwo)
Next

 

Share this post


Link to post
Share on other sites

0 just indicates the number of dimensions for example is it a 1d array or 2d array, you could use something like:

Switch UBound($aTableData, 0) ;~ Switch between 1d/2d arrays
    Case 1 ;~ 1d Array
        For $iRow = 0 To UBound($aTableData) - 1
            MsgBox(4096, "Item", "Row : " & $iRow & @CRLF & "Val : " & $aTableData[$iRow])
        Next
    Case 2 ;~ 2d Array
        For $iRow = 0 To UBound($aTableData) - 1
            For $iCol = 0 To UBound($aTableData, 2) - 1
                MsgBox(4096, "Item", "Row : " & $iRow & @CRLF & "Col : " & $iCol & @CRLF & "Val : " & $aTableData[$iRow][$iCol])
            Next
        Next
EndSwitch

 

Share this post


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

@FrancescoDiMuro, @Jos

I added 0 after UBound($aTableData

#include <IE.au3>
#include <Array.au3>
$oIE = _IEAttach ("Shop")
$oTable = _IETableGetCollection ($oIE, 1)
$aTableData = _IETableWriteToArray ($oTable)
For $inumber = 1 To UBound($aTableData, 0)
    $table = $aTableData[4][$inumber]
    MsgBox(0, "", $table)
Next

Now i am not getting any error

@Subz 

Will there be any problem with its use ?

Share this post


Link to post
Share on other sites
45 minutes ago, Subz said:

0 just indicates the number of dimensions for example is it a 1d array or 2d array, you could use something like:

Switch UBound($aTableData, 0) ;~ Switch between 1d/2d arrays
    Case 1 ;~ 1d Array
        For $iRow = 0 To UBound($aTableData) - 1
            MsgBox(4096, "Item", "Row : " & $iRow & @CRLF & "Val : " & $aTableData[$iRow])
        Next
    Case 2 ;~ 2d Array
        For $iRow = 0 To UBound($aTableData) - 1
            For $iCol = 0 To UBound($aTableData, 2) - 1
                MsgBox(4096, "Item", "Row : " & $iRow & @CRLF & "Col : " & $iCol & @CRLF & "Val : " & $aTableData[$iRow][$iCol])
            Next
        Next
EndSwitch

 

@Subz Error: Missing separator charecter after keyword.

Share this post


Link to post
Share on other sites

Thanks @Subz

Your code is really helpful.

i am getting number using 

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

$oIE = _IEAttach ("Shop")
$oTable = _IETableGetCollection ($oIE, 1)
$aTableData = _IETableWriteToArray ($oTable)
$iRow = 4
for $iCol = 1 To UBound($aTableData, 2) - 1
MsgBox(4096, "Item", "Row : " & $iRow & @CRLF & "Col : " & $iCol & @CRLF & "Val : " & Number($aTableData[$iRow][$iCol]))
Next

How can i find smallest number from it ?

Share this post


Link to post
Share on other sites
3 minutes ago, Subz said:

Arrays are always 0 based so Row 0 and Column 0 (only for 2d arrays) are the lowest numbers.

@Subz You are not understand me. 

i want to find smallest number from Number($aTableData[$iRow][$iCol]))

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

    • By D2thunder
      Hi all, I wasnt active in this Forum forum for Years. 😅
      Since I need something with Json in AutoIt i write a little UDF to save a variable to file to read it with another language - and back. After a while until my other script grows i thought - lets integrate all variables wich is possible, because i want have arrays to.
      This is my first public UDF in Autoit - normaly my AutoIt scripts are quick an dirty.... - like the examples for this udf. - someone want to write nice examples?
      I tried to write this UDF properly, cared for processing speed, low mem consumption as possible, a short code, and a high usability without beeing very familiar with arrays.
      What is it for? - convert nearly all types of variables to a json string for saving it in a file or to an ini. Read it back in to a same formated variable and preserv variable types. All array types are supported with nested arrays, the only restriction is ram and array/stringsize - and time if the array is very big. You can use Filters for variable types and some other options.
      If anyone found a bug or any suggestions, please post it.
       
      get Json.au3 from here Json.au3
       
       
      JsonVar 2019.01.25.1.zip
    • By Ho3ein
      Hi, i have a source code of "Danny35d" and i have 2 main question that are:
       How to extract this function's results (Datas are as Array) to combo-box without set number of datas?  When i type 1, 2 in _SystemUsers($AccountType = 0) to get only Local or Domain users, it just give me both of them, it's old problem of this function, please share us debugged code :)❤ #include <Array.au3> $Users = _ArrayToString(_SystemUsers(), "|", 1) ConsoleWrite($Users & @CRLF) #cs =============================================================================== Function: _SystemUsers($AccountType = 0) Description: Return an array with the local or domain username Parameter(s): $AccountType: Local, domain or both username 0 = Local and Domain usernames 1 = Local usernames only 2 = Domain usernames only Returns: An array with the list of usernames - Succeeded @error 1 - Didn't query any username @error 2 - Failed to create Win32_SystemUsers object @error 3 - Invalid $AccountType Author(s): Danny35d #ce =============================================================================== Func _SystemUsers($AccountType = 0) Local $aSystemUsers Local $wbemFlagReturnImmediately = 0x10, $wbemFlagForwardOnly = 0x20 Local $colItems = "", $strComputer = "localhost" If Not StringRegExp($AccountType, '[012]') Then Return SetError(3, 3, '') $objWMIService = ObjGet("winmgmts:\\" & $strComputer & "\root\CIMV2") $colItems = $objWMIService.ExecQuery("SELECT * FROM Win32_SystemUsers", "WQL", _ $wbemFlagReturnImmediately + $wbemFlagForwardOnly) If IsObj($colItems) Then For $objItem In $colItems $Output = StringSplit($objItem.PartComponent, ',') If IsArray($Output) Then $Temp = StringReplace(StringTrimLeft($Output[2], StringInStr($Output[2], '=', 0, -1)), '"', '') If $AccountType = 0 Or ($AccountType = 1 And @ComputerName = $Temp) Then $aSystemUsers &= StringReplace(StringTrimLeft($Output[1], StringInStr($Output[1], '=', 0, -1)), '"', '') & '|' ElseIf $AccountType = 2 And @ComputerName <> $Temp Then $aSystemUsers &= StringReplace(StringTrimLeft($Output[1], StringInStr($Output[1], '=', 0, -1)), '"', '') & '|' EndIf EndIf Next $aSystemUsers = StringTrimRight($aSystemUsers, 1) If $aSystemUsers = '' Then Return(SetError(1, 1, $aSystemUsers)) Return(SetError(0, 0, StringSplit($aSystemUsers, '|'))) Else $aSystemUsers = '' Return(SetError(2, 2, $aSystemUsers)) EndIf EndFunc ;==>_SystemUsers Thanks to your best Team.
    • By sksbir
      Hi
      Trying this from autoit v3.3.14.5 and SCITE 3.19.102.1901.0 :
      help file , page "Language Reference - Variables" , sample autoit script about maps:

      Maps must be declared before use by defining their scope using the 'Global/Local/Static' keywords. Local $mControls[]
      So is my test script : only with this local declation.
      -check syntax is OK
      - running script : 

      test.au3" (13) : ==> Variable subscript badly formatted.: Local $mControls[] Local $mControls[^ ERROR ->14:51:49 AutoIt3.exe ended.rc:1
      any clue ?
    • By Blitzkid
      Hello, i want to search several directories for files with the largest numbers behind them (Like "video123") . They dont have a datatype. But there are also files with longer names and datatypes in these folders (Like "video778.mp4"). Is it possible to filter the _FileListToArray Syntax from
      to smth. like
       
      Here is my Code
      #include <ButtonConstants.au3> #include <GUIConstantsEx.au3> #include <WindowsConstants.au3> #include <array.au3> #include <File.au3> $filedir = @ScriptDir & "\" _checkfile() Func _checkfile() ConsoleWrite("______________________" & @CRLF) Local $arr[3] = ["music", "picture", "video"] For $i = 0 To UBound($arr) - 1 Local $arrayfiles = _FileListToArray($filedir & $arr[$i], $arr[$i] & "*", 1) If @error = 1 Then ConsoleWrite($arr[$i] & "Error 1") EndIf If @error = 4 Then ConsoleWrite($arr[$i] & "Error 2") ;Exit EndIf $arrayfilter = _ArrayMax($arrayfiles, 0, 1) Global $stringfiles = StringReplace($arrayfilter, $arr[$i], "") ConsoleWrite($arrayfilter & @CRLF) Next EndFunc ;==>_checkfile  
    • By nacerbaaziz
      Good morning guys, i hope that you're all well.
      guys, i have a problem and i hope that you can help me
      i've created an 3d array
      the array Contain a Categories info
      as folow
      $array[n][0][0] = Categorie name
      $array[n][0][1] = Categorie file path
      $array[n][0][2] = Categorie contents number
      $array[n][m][0] = link name
      $array[n][m][1] = link url
      $array[n][m][2] = link section name
      in my tool i want to add an option to delete a Category
      as you know the Categorie mean that must delete a region from the array
      when i tried to use _arrayDelete
      with the 2d array it work well
      but here i couldn't find any way to do that, can any one help me please?
      thanks in advance.
×
×
  • Create New...