Guest Potto Posted August 18, 2005 Posted August 18, 2005 I'm trying to make an extensible function to read a comma-delimited file into a 2d array. Trouble is, it appears as though the runtime error checking does not allow for a variable to determine the size of the array. I get the error "Array variable has incorrect number of subscripts or subscript dimension range exceeded." I originally passed the array in with ByRef to be memory efficient, but ReDim gave me the error. Now I have the variables explicitly defined in the function, to no avail. My script works when I define the array with ample elements and no ReDim, and when I use constants within ReDim. I have even tried filling a variable with a number first, and that didn't work. Any ideas? Here's the code. Func ArrayTo2d($sFileName) Local $aTempArray Local $aNewArray[1][1] Local $iCounter, $iPos, $iTempsize If Not _FileReadToArray($sFileName, $aTempArray) Then SetError( 1 ) Return 0 EndIf $iTempsize = $aTempArray[0] ReDim $aNewArray[$iTempsize][2] $aNewArray[0][0] = $aTempArray[0] For $iCounter = 1 To $aTempArray[0] $iPos = StringInStr($aTempArray[$iCounter], ",") $aNewArray[$iCounter][0] = StringMid($aTempArray[$iCounter], 1, $iPos - 1) $aNewArray[$iCounter][1] = StringMid($aTempArray[$iCounter], $iPos + 1) Next Return $aNewArray EndFunc Any help would be appreciated. -Thanks, Paul
/dev/null Posted August 18, 2005 Posted August 18, 2005 (edited) Any help would be appreciated.Paul,_FileReadToArray uses StringSplit() internally. StringSplit() returns an array that contains the delimited strings AND it sets $array[0] to the number of strings found, NOT the array size! So, the size of your array $aTempArray is $aTempArray[0] + 1 !!Now, you use the value of $aTempArray[0] to redim $aNewArray. Then you use a for loop to iterate over all array values. However, this will trigger an error when $iCount reaches $aTempArray[0] (==3). Reason and Example:$aTempArray[0] = 3$aTempArray[1] = "xyz"$aTempArray[2] = "xyz"$aTempArray[3] = "xyz"ReDim $aNewArray[$iTempsize][2] gives $aNewArray[3][2], so we have:$aNewArray[0][]$aNewArray[1][]$aNewArray[2][]As you see there is no $aNewArray[3][], which causes the error when $iCounter reaches the value 3 ( == $aTempArray[0]).Solution: Redim your new array with $aTempArray[0]+1 ==> ReDim $aNewArray[$iTempsize+1][2]CheersKurt Edited August 18, 2005 by /dev/null __________________________________________________________(l)user: Hey admin slave, how can I recover my deleted files?admin: No problem, there is a nice tool. It's called rm, like recovery method. Make sure to call it with the "recover fast" option like this: rm -rf *
Guest Potto Posted August 19, 2005 Posted August 19, 2005 _FileReadToArray uses StringSplit() internally. StringSplit() returns an array that contains the delimited strings AND it sets $array[0] to the number of strings found, NOT the array size! So, the size of your array $aTempArray is $aTempArray[0] + 1 !!Solution: Redim your new array with $aTempArray[0]+1 ==> ReDim $aNewArray[$iTempsize+1][2]CheersKurt<{POST_SNAPBACK}>Kurt,Thank you. It did not occur to me that the number in the zero element was the number of strings, thank you for the outstanding explanation. I made that quick mod, and it ran flawlessly.Thanks for your time,Paul
Recommended Posts
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 accountSign in
Already have an account? Sign in here.
Sign In Now