RyukShini

Array variable has incorrect number of subscripts

11 posts in this topic

#1 ·  Posted (edited)

Local $okay
_FileReadToArray("Okay.txt", $okay) ; read the list of names to array
For $i = 1 To UBound($okay) - 1
$Read = $okay[$i]

If I run this and it goes to the end of Okay.txt it returns an error.
"Array variable has incorrect number of subscripts or subscript dimension range exceeded.:"
so can I either exitloop if its run through the file or add some error checking that exitloop if array = empty?
Thanks in advance.

Edited by RyukShini

Share this post


Link to post
Share on other sites



#2 ·  Posted (edited)

You should add a line to visualize your data to make sure it contains what you think it should.  Otherwise, using ubound($array)-1 should make the loop run the correct number of times.  Try this and look at the array, does it appear as you would expect it? 

Local $usrpwd
_FileReadToArray("Okay.txt", $okay) ; read the list of names to array
_arrayDisplay($okay); visualize data
For $i = 1 To UBound($okay) - 1
$Read = $okay[$i]

I tested this version which is almost the exact same as yours.  The file contained three lines of data.  I added debugging to error check the array creation and visualize it.  It works fine.  Maybe you could post your whole code?

#include <Array.au3>
#include <File.au3>
global $okay
Local $usrpwd
$result=_FileReadToArray(@ScriptDir&"\tesfile.txt", $okay)
ConsoleWrite($result&" error: "&@error&@crlf)
_arrayDisplay($okay); visualize data
For $i = 1 To UBound($okay) - 1
$Read = $okay[$i]
ConsoleWrite($Read)
Next

 

Edited by Jfish

Build your own poker game with AutoIt: pokerlogic.au3 | Learn To Program Using FREE Tools with AutoIt

Share this post


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

You should add a line to visualize your data to make sure it contains what you think it should.  Otherwise, using ubound($array)-1 should make the loop run the correct number of times.  Try this and look at the array, does it appear as you would expect it? 

Also, note the difference in starting the loop at 0 vs 1.

Local $okay
_FileReadToArray("Okay.txt", $okay) ; read the list of names to array
_arrayDisplay($okay); visualize data
For $i = 1 To UBound($okay) - 1
$Read = $okay[$i]

 

It seems to be correct?
65972e210676f85cfedd61674f5f7514.png

 

 

Share this post


Link to post
Share on other sites

#4 ·  Posted (edited)

Yes, try running my code where I put the results to the console in the for loop.  You should see all four items from 1-4 in the console window of Scite.

Edited by Jfish

Build your own poker game with AutoIt: pokerlogic.au3 | Learn To Program Using FREE Tools with AutoIt

Share this post


Link to post
Share on other sites

@RyukShini

And on which line of code do you get that error?
The code in your first post seems correct (although not full)

Share this post


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

Yes, try running my code where I put the results to the console in the four loop.  You should see all four items from 1-4 in the console window of Scite.

Your code works, but I actually just found out why mine wasn't working.
I needed a Continueloop in my code inside an IF statement.
Now it works as intended and it continues the loop/stops correctly.
Thanks a lot for the help ;)
 

Share this post


Link to post
Share on other sites
7 minutes ago, Jfish said:

Ah, okay glad it is working but next time please include a full reproducer.  That IF statement would have been good info ...

Alright sorry about that. ;)

Share this post


Link to post
Share on other sites

If you dont specify any flags to _FileReadToArray(), it will store the array count on index 0 by default.

For $i = 1 to $okay[0]
    $Read = $okay[$i]
Next

 


---------Arthur B

Share this post


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

If you dont specify any flags to _FileReadToArray(), it will store the array count on index 0 by default.

For $i = 1 to $okay[0]
    $Read = $okay[$i]
Next

 

Alright thank you for making that clear.

Share this post


Link to post
Share on other sites

#11 ·  Posted

On 26/10/2016 at 7:01 AM, RyukShini said:

Your code works, but I actually just found out why mine wasn't working.
I needed a Continueloop in my code inside an IF statement.
Now it works as intended and it continues the loop/stops correctly.
Thanks a lot for the help ;)
 

 

it would have been nice if you post your codes that work

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

    • TheDcoder
      By TheDcoder
      Hello everyone, I discovered a bug yesterday and I posted it at the bug tracker:
      I also made a simple script which can be used to reproduce the bug:
      CreateVariable() ConsoleWrite($sGlobalVariable & @CRLF) Func CreateVariable() Global $sGlobalVariable = "Foobar" EndFunc The bug was closed by @BrewManNH:
      While I partially agree with the above statement, My code was not practical enough... so @mLipok advised me to create a thread on the forums with practical code (Thanks!). That is the point of this thread, I am going to provide the code where I experience this bug/problem .
      I discovered this bug when I was working on one of my projects called "ProxAllium". When the main script finishes execution, Au3Check throws a nasty warning about "variable possibly used before declaration":

      As you can see, the variable is indeed being used after calling the function in which the variable is declared... The warning won't appear if I declare the function ABOVE the variable. As @BrewManNH said, Au3Check reads line by line... I think this should be changed, Au3Check should not throw warnings if the interpreter is able to run the code, at least most of the time anyway!
      So what do you guys think? Is this a valid bug?... and I request those who participate in the discussion not to discuss the code being "poor", that is another thing/thread in itself
      P.S I had already written this once but the forum editor decided to mess up and when I undid (Ctrl + Z) something... This is a poorly written version of that article, I was very frustrated while writing this!
    • TMelanson
      By TMelanson
      Hi folks,
      I'm hoping someone can help me out here.
      Background:
      I have the need to run a program with admin credentials (#RequireAdmin), and then get the SID of the locally logged in account. Not the admin account.
      If you look at the attached script, Line 16 uses the @UserName variable and returns the SID for the admin account I used to launch the app.
      I want to use line 17 which passes the result of the _GetUsername function which is a username using  ($UserName) to the WMIService.
      I'm getting " The requested action with this object has failed.:" error message.
      Any suggestions would be appreciated!
       
      test1.au3
    • StillLearningThisStuff
      By StillLearningThisStuff
      Hello all,
      Summary: I have a basic piece of code that is to be a part of a much larger project; I just can't seem to get the right output. I'm retrieving two lots of powershell data into 2 x 1d arrays and trying to add them into a single 2d array. Retrieving the data together into the 2d array seemed harder, due to the application names varying too much to string split. Data being pulled is application name and GUID. From here I will use this info in a drop down box and an uninstall button to run the required command to remove the selected software (have this sorted already).
      Problem: When I merge the data it doesn't put the application name and GUID on the same row in differing columns eg. my test box has 24 applications plus some superfluous data from Powershell to be cleaned up by the _arraydeletes. Instead I end up with an array with 58 rows and 2 columns; whereas my temp 1d arrays have 28 rows. As you can see I've tried both _ArrayInsert and _ArrayAdd but I still get the same result.
      Question: Is there something that I'm doing wrong in putting the data into the 2d array or do I just need to do some more post processing to tidy it up and align the names and GUIDs?
      Code:
      #include <Array.au3> $Cmd1 = (" /c Powershell.exe " & Chr(34) & "Get-WmiObject -Class win32reg_addremoveprograms | where {$_.ProdID -like " & Chr(34) & Chr(123) & Chr(42) & Chr(125) & Chr(34) & "} | select DisplayName" & Chr(34)) $Cmd2 = (" /c Powershell.exe " & Chr(34) & "Get-WmiObject -Class win32reg_addremoveprograms | where {$_.ProdID -like " & Chr(34) & Chr(123) & Chr(42) & Chr(125) & Chr(34) & "} | select ProdID" & Chr(34)) Global $aNameGUID[1][2] ;_ArrayDisplay($aNameGUID) ReadApps($Cmd1,0) ;_ArrayDisplay($aNameGUID) ReadApps($Cmd2,1) _ArrayDisplay($aNameGUID) Terminate() Func ReadApps($Command,$col) $DOS = Run(@ComSpec & $Command, "", @SW_HIDE, $STDERR_CHILD + $STDOUT_CHILD) ProcessWaitClose($DOS) $DOSOut = StdoutRead($DOS) ;MsgBox(0,"Data",$DOSOut) ;Show the line items that we want in the array Local $tmpArray = StringSplit(StringTrimRight(StringStripCR($DOSOut), StringLen(@CRLF)), @CRLF) If @error Then MsgBox(0,"FAIL","I failed to find objects") Exit Else _ArrayDisplay($tmpArray) EndIf ;_ArrayDelete($tmpArray, 3) ;_ArrayDelete($tmpArray, 2) ;_ArrayDelete($tmpArray, 1) ;$tmpArray[0] = $tmpArray[0] - 3 For $i = 0 To UBound($tmpArray) - 1 ;_ArrayAdd($aNameGUID, $tmpArray[$i], $col) _ArrayInsert($aNameGUID, 0, $tmpArray[$i], $col) Next $tmpArray = 0 EndFunc ;==>ReadApps While 1 Sleep(1500) WEnd Func Terminate() Exit 0 EndFunc ;==>Terminate Thanks in advance,
      Luxyboy
    • harvester2001
      By harvester2001
      Hi
      I need some help.
      I try ping computers from targets.txt (I have computer name in lines) if they ping I want do something and after that remove pc name from targets.txt. It`s working but problem is when I put this inside loop, because I need run script until all computers will not be removed from the list (targets.txt). I don`t know how to "refresh" array
      Please help
      #include <File.au3> #include <Array.au3> #include <MsgBoxConstants.au3> Local $PC_list = "\targets.txt" Local $bTargets = FileReadToArray(@ScriptDir& $PC_list) Do _check_ping() ;count_lines Local $file_count_lines = _FileCountLines(@ScriptDir& $PC_list) $i = $file_count_lines ConsoleWrite("na liście "&$i & @CRLF) Until $i = 0 ; IF &i = 0 then show MsgBox MsgBox(1, "xXx", "Finish") ;PING Func _check_ping() For $sPC In $bTargets $var = Ping($sPC, 250) If $var Then ConsoleWrite($sPC &"online"& @CRLF) ;Do something ;Delete $sPC from targets.txt Local $_Array _FileReadToArray ( @ScriptDir& "\targets.txt", $_Array ) $_Array = _DeleteArrayElementWithStringInstr ( $_Array, $sPC ) _FileWriteFromArray ( @ScriptDir& "\targets.txt", $_Array, 1 ) Sleep(200) Else ConsoleWrite($sPC &"offline"& @CRLF) EndIf Next EndFunc ;DELETE LINE FROM TXT Func _DeleteArrayElementWithStringInstr ( $_Array, $_String ) Local $_Item For $_Element In $_Array If StringInStr ( $_Element, $_String ) <> 0 Then _ArrayDelete ( $_Array, $_Item ) Else $_Item+=1 EndIf Next Return ( $_Array ) EndFunc ;==> _DeleteArrayElementWithStringInstr ( )  
    • j0kky
      By j0kky
      Hi guys,
      talking about array in array, I would like to directly assign a value to an element in an array contained in another array.
      While it is quite simple to access the value if it is already setted:
      Local $a[3] = [1, 2], $b[2] = [3, 4] $a[2] = $b ConsoleWrite(($a[2])[0] & " " & ($a[2])[1] & @CRLF) If I try to write directly to the element, I get an error:
      Local $a[3] = [1, 2] Local $b[2] $a[2] = $b ($a[2])[0] = 1 Is assigning first every value of the contained array and then including it in the container the only way?