dewcansam Posted October 29, 2014 Share Posted October 29, 2014 (edited) I started out trying to make a function to read USB drives to array to generate a Combo or List box control. I followed this post '?do=embed' frameborder='0' data-embedContent>> Did not really like the way they did things, but i realized that i did not need to make an array to generate the items in a Combo or List box control. The question is this: This is the function that I did come up with. But I really wanted to return the array with only the 'Fixed' and 'Removable' drive items. My code reflects the _ArrayDelete() call commented out. If you un-comment it the function returns an error saying the subscript is out-of-bounds. And that makes sense because _ArrayDelete() removes a element and so the array is really one less then it started out to be. Since the For loop started out with X elements and now it is X-1. So, what can be done to fix this ?? I thought that the answer lies somewhere in creating a new array and stores the elements that you want to keep in the new array and returns that array (if that makes sense). Code (working code that returns string): expandcollapse popup#comments-start /*********************************************************************** @name function getUsbDrives vers: 0.03 date: 2014-10-28 19:25:08 created on: 2014-10-14 22:28:22 created by: Christopher L. Smith gets all drives then removes anything that is not of type 'fixed' or of type 'removable' then returns a string formated for a GUICtrlCreateList or GUICtrlCreateCombo. @return string formated for List / Combo controls @access public ***********************************************************************/ #comments-end Func getUsbDrives() Local $drv = DriveGetDrive("all");used $drv because $drives and $drive were getting hard to distinguish Local $rtn If @error Then MsgBox(4096, "DriveGetDrive", "It appears an error occurred.") Else For $i = 1 To $drv[0] ;;; loops through the drives and finds only 'Fixed' or 'Removable' If DriveGetType($drv[$i]) = "Fixed" Or DriveGetType($drv[$i]) = "Removable" Then ;;; and then gets rid of the local drive. If Not ($drv[$i] = "c:") Then ;;; returns array of drives (could not get it to work) ;_ArrayDelete( $drv ,$i) ;;; returns string formated for List / Combo controls $rtn &= $drv[$i] & '|' EndIf EndIf Next EndIf Return $rtn EndFunc ;==>getUsbDrives comment out the "$rtn &= $drv[$i] & '|'" line (34) and un-comment the "_ArrayDelete( $drv ,$i)" line (32) to get the error that I am referring to. Edited October 29, 2014 by dewcansam Link to comment Share on other sites More sharing options...
Solution Luigi Posted October 29, 2014 Solution Share Posted October 29, 2014 (edited) Use _ArrayDel() on-the-fly or iterate a loop and delete an item of the same array... Not good for me. I always use @error immediately after the function. I never let anything between function and @error. Nowadays, I avoid using nested conditionals (before I used a lot). Those are my practices. Maybe this? #include <Array.au3> Local $var = getUsbDrives() _ArrayDisplay($var) Func getUsbDrives() Local $aDel[1] Local $aDrives = DriveGetDrive("all") If @error Then MsgBox(4096, "DriveGetDrive", "It appears an error occurred.") Else For $ii = 1 To $aDrives[0] Switch DriveGetType($aDrives[$ii]) Case "Fixed", "Removable" If Not ($aDrives[$ii] == @HomeDrive) Then _ArrayAdd($aDel, $ii) EndSwitch Next For $ii = 1 To UBound($aDel, 1) - 1 _ArrayDelete($aDrives, $aDel[$ii]) Next EndIf If UBound($aDel, 1) Then _ArrayDelete($aDrives, 0) Return $aDrives EndFunc ;==>getUsbDrives Edited October 29, 2014 by Detefon Visit my repository Link to comment Share on other sites More sharing options...
BrewManNH Posted October 29, 2014 Share Posted October 29, 2014 When deleting things from an array, loop through the array in reverse. So instead of: For $i = 1 To $drv[0] Use this: For $i = $drv[0] To 1 Step -1 This way whatever you delete will always be above the next number in the loop. Luigi 1 If I posted any code, assume that code was written using the latest release version unless stated otherwise. Also, if it doesn't work on XP I can't help with that because I don't have access to XP, and I'm not going to.Give a programmer the correct code and he can do his work for a day. Teach a programmer to debug and he can do his work for a lifetime - by Chirag GudeHow to ask questions the smart way! I hereby grant any person the right to use any code I post, that I am the original author of, on the autoitscript.com forums, unless I've specifically stated otherwise in the code or the thread post. If you do use my code all I ask, as a courtesy, is to make note of where you got it from. Back up and restore Windows user files _Array.au3 - Modified array functions that include support for 2D arrays. - ColorChooser - An add-on for SciTE that pops up a color dialog so you can select and paste a color code into a script. - Customizable Splashscreen GUI w/Progress Bar - Create a custom "splash screen" GUI with a progress bar and custom label. - _FileGetProperty - Retrieve the properties of a file - SciTE Toolbar - A toolbar demo for use with the SciTE editor - GUIRegisterMsg demo - Demo script to show how to use the Windows messages to interact with controls and your GUI. - Latin Square password generator Link to comment Share on other sites More sharing options...
dewcansam Posted October 29, 2014 Author Share Posted October 29, 2014 Good idea. Would not have thought of that. I will try it out it in a bit. Thanks. Link to comment Share on other sites More sharing options...
Luigi Posted October 29, 2014 Share Posted October 29, 2014 I never try with reverse iteration... Hummmmmm.... Visit my repository Link to comment Share on other sites More sharing options...
dewcansam Posted October 29, 2014 Author Share Posted October 29, 2014 I never try with reverse iteration... Hummmmmm.... Yeah, I was thinking more along the lines of what you displayed. Where you created a new array, populated it with what you were keeping then rewrote the original array. Link to comment Share on other sites More sharing options...
dewcansam Posted October 29, 2014 Author Share Posted October 29, 2014 I avoid using nested conditionals (before I used a lot). Yeah, I did NOT like the nested conditions either. Could not think of a cleaner way. Thanks for the point out. What exactly do you mean by I always use @error immediately after the function. I never let anything between function and @error. Could you clear that up a little bit. Link to comment Share on other sites More sharing options...
Luigi Posted October 29, 2014 Share Posted October 29, 2014 (edited) Yes! I see you use this... Local $drv = DriveGetDrive("all");used $drv because $drives and $drive were getting hard to distinguish Local $rtn If @error Then You left a "Local $rtn" between "Local $drv..." and "If @error..." I use this Local $rtn Local $drv = DriveGetDrive("all");used $drv because $drives and $drive were getting hard to distinguish If @error Then Nothing between "The function" and "The @error"... I see in the Help File, Logal, Global Or Dim not return @error (this is not the case). But I don't like this. If was another function can return set an @error? Possible a false @error or not! Use @error is very good. Regards, Detefon obs: @dewcansam, I have this topics in my favorites and always consult: https://www.autoitscript.com/wiki/Best_coding_practices '?do=embed' frameborder='0' data-embedContent>> Edited October 29, 2014 by Detefon Visit my repository Link to comment Share on other sites More sharing options...
dewcansam Posted October 29, 2014 Author Share Posted October 29, 2014 (edited) I use this Local $rtn Local $drv = DriveGetDrive("all");used $drv because $drives and $drive were getting hard to distinguish If @error Then Nothing between "The function" and "The @error"... I see in the Help File, Logal, Global Or Dim not return @error (this is not the case). Ohhhhh. I got ya. And nice point out on the coding practices. Will have to try to implement some of them. Edited October 29, 2014 by dewcansam Link to comment Share on other sites More sharing options...
guinness Posted October 29, 2014 Share Posted October 29, 2014 I would also argue that it's best to declare and assign when required, i.e. lowest scope possible. I see I need to update the wiki at some point. UDF List: _AdapterConnections() • _AlwaysRun() • _AppMon() • _AppMonEx() • _ArrayFilter/_ArrayReduce • _BinaryBin() • _CheckMsgBox() • _CmdLineRaw() • _ContextMenu() • _ConvertLHWebColor()/_ConvertSHWebColor() • _DesktopDimensions() • _DisplayPassword() • _DotNet_Load()/_DotNet_Unload() • _Fibonacci() • _FileCompare() • _FileCompareContents() • _FileNameByHandle() • _FilePrefix/SRE() • _FindInFile() • _GetBackgroundColor()/_SetBackgroundColor() • _GetConrolID() • _GetCtrlClass() • _GetDirectoryFormat() • _GetDriveMediaType() • _GetFilename()/_GetFilenameExt() • _GetHardwareID() • _GetIP() • _GetIP_Country() • _GetOSLanguage() • _GetSavedSource() • _GetStringSize() • _GetSystemPaths() • _GetURLImage() • _GIFImage() • _GoogleWeather() • _GUICtrlCreateGroup() • _GUICtrlListBox_CreateArray() • _GUICtrlListView_CreateArray() • _GUICtrlListView_SaveCSV() • _GUICtrlListView_SaveHTML() • _GUICtrlListView_SaveTxt() • _GUICtrlListView_SaveXML() • _GUICtrlMenu_Recent() • _GUICtrlMenu_SetItemImage() • _GUICtrlTreeView_CreateArray() • _GUIDisable() • _GUIImageList_SetIconFromHandle() • _GUIRegisterMsg() • _GUISetIcon() • _Icon_Clear()/_Icon_Set() • _IdleTime() • _InetGet() • _InetGetGUI() • _InetGetProgress() • _IPDetails() • _IsFileOlder() • _IsGUID() • _IsHex() • _IsPalindrome() • _IsRegKey() • _IsStringRegExp() • _IsSystemDrive() • _IsUPX() • _IsValidType() • _IsWebColor() • _Language() • _Log() • _MicrosoftInternetConnectivity() • _MSDNDataType() • _PathFull/GetRelative/Split() • _PathSplitEx() • _PrintFromArray() • _ProgressSetMarquee() • _ReDim() • _RockPaperScissors()/_RockPaperScissorsLizardSpock() • _ScrollingCredits • _SelfDelete() • _SelfRename() • _SelfUpdate() • _SendTo() • _ShellAll() • _ShellFile() • _ShellFolder() • _SingletonHWID() • _SingletonPID() • _Startup() • _StringCompact() • _StringIsValid() • _StringRegExpMetaCharacters() • _StringReplaceWholeWord() • _StringStripChars() • _Temperature() • _TrialPeriod() • _UKToUSDate()/_USToUKDate() • _WinAPI_Create_CTL_CODE() • _WinAPI_CreateGUID() • _WMIDateStringToDate()/_DateToWMIDateString() • Au3 script parsing • AutoIt Search • AutoIt3 Portable • AutoIt3WrapperToPragma • AutoItWinGetTitle()/AutoItWinSetTitle() • Coding • DirToHTML5 • FileInstallr • FileReadLastChars() • GeoIP database • GUI - Only Close Button • GUI Examples • GUICtrlDeleteImage() • GUICtrlGetBkColor() • GUICtrlGetStyle() • GUIEvents • GUIGetBkColor() • Int_Parse() & Int_TryParse() • IsISBN() • LockFile() • Mapping CtrlIDs • OOP in AutoIt • ParseHeadersToSciTE() • PasswordValid • PasteBin • Posts Per Day • PreExpand • Protect Globals • Queue() • Resource Update • ResourcesEx • SciTE Jump • Settings INI • SHELLHOOK • Shunting-Yard • Signature Creator • Stack() • Stopwatch() • StringAddLF()/StringStripLF() • StringEOLToCRLF() • VSCROLL • WM_COPYDATA • More Examples... Updated: 22/04/2018 Link to comment Share on other sites More sharing options...
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