Array-Fehler

  • Hallo,

    bekomme bei folgendem Skript immer einen Array-Fehler: Array variable has incorrect number of subscripts or subscript dimension range exceeded.:
    msgbox(0,0, "Name: " & $_CI_GetPrinter[$i][0] & ", Treiber: " & $_CI_GetPrinter[$i][1] & ", Anschluss: " & $_CI_GetPrinter[$i][2])
    msgbox(0,0, "Name: " & ^ ERROR

    [autoit]

    Func _CI_GetPrinter()
    Local $aReturn[2][3]
    Local $x = 0, $objWMIService, $colItems
    $objWMIService = ObjGet('winmgmts:\\localhost\root\cimv2')
    If Not IsObj($objWMIService) Then Return SetError(1, 0, 0)
    $colItems = $objWMIService.ExecQuery('SELECT * FROM Win32_Printer', 'WQL', 0x30)
    If IsObj($colItems) Then
    For $objItem In $colItems
    $x += 1
    ReDim $aReturn[$x + 1][3]
    $aReturn[$x][0] = $objItem.Name
    $aReturn[$x][1] = $objItem.DriverName
    $aReturn[$x][2] = $objItem.PortName
    Next
    EndIf
    Return $aReturn
    EndFunc

    [/autoit][autoit][/autoit][autoit]

    #include <array.au3>
    $_CI_GetPrinter = _CI_GetPrinter()

    [/autoit][autoit][/autoit][autoit]

    for $i = 1 to UBound($_CI_GetPrinter)
    msgbox(0,0, "Name: " & $_CI_GetPrinter[$i][0] & ", Treiber: " & $_CI_GetPrinter[$i][1] & ", Anschluss: " & $_CI_GetPrinter[$i][2])
    Next

    [/autoit]

    Steh gerad ein wenig auf dem Schlauch ..

  • Das erste Element in einem Array hat immer den Index 0. Das heißt, der Index eines Arrays mit 4 Elementen sieht so aus: "0, 1, 2, 3".
    UBound gibt die Größe der gewünschten Dimension des Arrays zurück. Nicht den Index des letzten Elements ;).
    Also muss deine For Schleife eher so aussehen:

    [autoit]

    for $i = 0 to UBound($_CI_GetPrinter) -1

    [/autoit]
  • Auf das -1 bin ih dann zwischendurch auch gekommen! Nur fügt er mir jetzt noch eine leere Zeile ein, wo kommt die nun her? Oo

  • Zitat

    Auf das -1 bin ih dann zwischendurch auch gekommen!


    Kann ich ja nicht riechen :P.

    Zitat

    Nur fügt er mir jetzt noch eine leere Zeile ein, wo kommt die nun her? Oo


    Vermutlich weil die Funktion nicht so ganz durchdacht ist... Da wird nämlich der selbe Fehler gemacht ^^. Das Array wird dort erst ab dem Element mit dem Index 1 befüllt...
    Versuch mal:

    [autoit]

    for $i = 1 to UBound($_CI_GetPrinter) -1

    [/autoit]
  • Naja so wie ich das sehe wird beim Befüllen des Arrays der Zähler x erhöht und dann erst im Array gespeichert, das heisst die Zeile 0 des Arrays wird leer bleiben und die Daten fangen erst in Zeile 1 an. Dein erster Ansatz die Ausgabe mit $i=1 anzufangen war also meiner Meinung nach korrekt, nur eben hinten beim ubound hattest du deinen Fehler.

    EDIT: Name war schneller

  • Jep, das funtkioniert jetzt supi! :)

    Aber sagtmal.. ich krieg auf einem anderen System immernoch ein Array-Fehler! Er zeigt dann in einer MSGBOX irgendwas bei Zeile 7003 an .. Kann ich irgendwie genauer Erfahren wo er aussteigt?

    Gruß

  • Zitat

    Aber sagtmal.. ich krieg auf einem anderen System immernoch ein Array-Fehler! Er zeigt dann in einer MSGBOX irgendwas bei Zeile 7003 an .. Kann ich irgendwie genauer Erfahren wo er aussteigt?


    Vermutlich nicht wenn das ganze kompiliert ist... Du kannst ja mal @error auslesen und ggf. die Zeile überprüfen.
    Die Zeilenangaben bei kompilierten Dateien sind natürlich dann Quatsch ;).

  • Da deine Funktion auch verlassen werden kann ohne dass ein Array zurückgegeben wird (Zeile 5) musst du natürlich nach dem Funktionsaufruf auch prüfen ob du ein Array oder einen error von der Funktion zurückgeliefert bekommen hast. Deine msgbox Schleife darf also nur dann ausgeführt werden wenn kein error auftrat.

    [autoit]

    Func _CI_GetPrinter()
    ;...
    If Not IsObj($objWMIService) Then Return SetError(1, 0, 0) ; verlässt die funktion ohne ein array zurückzugeben
    ;...
    EndFunc

    [/autoit][autoit][/autoit][autoit]

    #include <array.au3>
    $_CI_GetPrinter = _CI_GetPrinter()
    if not @error then
    for $i = 1 to UBound($_CI_GetPrinter)
    msgbox(0,0, "Name: " & $_CI_GetPrinter[$i][0] & ", Treiber: " & $_CI_GetPrinter[$i][1] & ", Anschluss: " & $_CI_GetPrinter[$i][2])
    Next
    else
    msgbox(0,"Fehler","WMI Objekt konnte nicht erstellt werden..")
    endif

    [/autoit]