Alternative zu _ArrayAdd

  • Hallo,
    ich möchte einen Eintrag zu einem 2D-Array hinzugügen. Die Hilfe sagt ja, dass bei _ArrayAdd nur mit 1D-Arrays gearbeitet werden kann. Welche 2D-Alternative gibt es hierzu?

    Einmal editiert, zuletzt von Scritch (9. Mai 2011 um 08:50)

  • Ja, einfach selbst schreiben, ganz einfach :P
    Ich habe hier eine Teillösung gefunden, ist aber kein 2 Zeiler
    und ich weiß auch noch nicht, wie ich in die 2 Spalte Werte reinbekomme.

    Spoiler anzeigen
    [autoit]

    $sMsg = "Add a single element to a 2D array:" & @CRLF
    Global $avTesting[3][2] = [[1, 2],[3, 4],[5, 6]]
    $RET = __ArrayAdd($avTesting, "Test")
    $iErrSav = @error
    $iExtSav = @extended
    _ArrayDisplay($avTesting, "$avTesting")

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

    Func __ArrayAdd(ByRef $avArray, $vValue, $NestArray = True)
    Local $iBoundArray0, $iBoundArray1, $iBoundArray2, $iBoundValue1

    If IsArray($avArray) = 0 Then Return SetError(1, 0, -1); $avArray is not an array

    $iBoundArray0 = UBound($avArray, 0); No. of dimesions in array
    If $iBoundArray0 > 2 Then Return SetError(1, 1, -1); $avArray is more than 2D

    $iBoundArray1 = UBound($avArray, 1); Size of array in first dimension
    If $iBoundArray0 = 2 Then $iBoundArray2 = UBound($avArray, 2); Size of array in second dimension

    If ($iBoundArray0 = 1) Or (IsArray($vValue) = 0) Or $NestArray Then
    ; If input array is 1D, or $vValue is not an array, or $NestArray = True (default) then save $vValue literally
    If $iBoundArray0 = 1 Then
    ; Add to 1D array
    ReDim $avArray[$iBoundArray1 + 1]
    $avArray[$iBoundArray1] = $vValue
    Else
    ; Add to 2D array at [n][0]
    ReDim $avArray[$iBoundArray1 + 1][$iBoundArray2]
    $avArray[$iBoundArray1][0] = $vValue
    EndIf
    Else
    ; If input array is 2D, and $vValue is an array, and $NestArray = False,
    ; then $vValue is a 1D array of values to add as a new row.
    If UBound($vValue, 0) <> 1 Then Return SetError(1, 2, -1); $vValue array is not 1D
    $iBoundValue1 = UBound($vValue, 1)
    If $iBoundArray2 < $iBoundValue1 Then Return SetError(1, 3, -1); $vValue array has too many elements
    ReDim $avArray[$iBoundArray1 + 1][$iBoundArray2]
    For $n = 0 To $iBoundValue1 - 1
    $avArray[$iBoundArray1][$n] = $vValue[$n]
    Next
    EndIf

    ; Return index of new last row in $avArray
    Return $iBoundArray1
    EndFunc ;==>__ArrayAdd

    [/autoit]


    Ich probiers mal mit dem alleine schreiben ^^

  • Soo:

    Spoiler anzeigen
    [autoit]

    #include <array.au3>
    #include <file.au3>

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

    dim $pcname[1] = ["pcname"]
    Local $csvpfad = @ScriptDir & "\test.csv"
    Local $open = FileOpen($csvpfad, 0)
    ;~ global $csv2array = _CSV2Array($open, Default, True, 1)
    FileClose($csvpfad)
    ;_ArrayDisplay($csv2array)

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

    For $a = 1 To UBound($pcname) - 1
    $onlinestatus = Ping($pcname[$a],500) ; onlinestatus abfragen für schnellere verarbeitung
    If $onlinestatus Then

    Local $software = "\\" &$pcname[$a] & "\d$\HaSo\software.ini"
    Global $asoftware
    _FileReadtoarray($software, $asoftware) ;Erste Softwareliste wird eingelesen und gleich in die .csv geschrieben

    for $b = 1 to ubound($asoftware) - 1
    dim $csv[$b - 1][0] = $asoftware[$b]
    _ArrayDisplay($csv)
    Next
    EndIf
    Next

    [/autoit]

    Ich lese hier eine Liste mit installierter Software von einem anderen Computer in ein array ein. Dann möchte ich diese Liste an
    Software gerne in ein anderes Array, in die erste Spalte haben. Das habe ich mit

    [autoit]

    for $b = 1 to ubound($asoftware) - 1
    dim $csv[$b - 1][0] = $asoftware[$b]
    _ArrayDisplay($csv)
    Next

    [/autoit]


    versucht. Das sagt mir Autoit aber immer "badly formated". Ich komme einfach nicht drauf, was ich verkehrt mache :(

  • Dein Skript kann ich ja nicht testen da ich die "test.csv" ja nicht habe.
    Dennoch mal ein kleiner Denkanstoß:
    Hab dein Skript mal auf einen wesentlichen Aspekt hin verkürzt - was fällt dir dabei auf?:

    Spoiler anzeigen
    [autoit]

    dim $pcname[1] = ["pcname"]

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

    For $a = 1 To UBound($pcname) - 1
    MsgBox(0,"", "Wird ausgeführt")
    Next

    [/autoit]


    Nun mal zu deinem neuen Codeteil.
    Ich verstehe es so das du ein 2D-Array erstellen willst und gleich direkt eine Spalte mit dem Inhalt eines 1D-Arrays befüllen willst.
    Das geht nicht in einer Zeile (maximal nur über eine UDF).
    Du musst schon Element für Element in einer Schleife durchgehen und die Elemente einzeln einzutragen.
    Warum du in der Schleife immer ein neues Array erstellst (dim) ist mir zwar nicht klar aber in der 2. Dimension sollte schon eine Zahl größer 0 stehen weil ein 2D-Array mit der Spaltenanzahl 0 einfach mal "Nichts" ist.

    Vielleicht zur Verständnis nochmal der angesprochene 2-Zeiler (hier sind es 3 da ich die Elemente einzeln eintrage):

    Spoiler anzeigen
    [autoit]

    #include <Array.au3>

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

    ; Array mit 3 "Zeilen" und 2 "Spalten":
    Global $aTest[3][2] = [[1, 2],[3, 4],[5, 6]]
    _ArrayDisplay($aTest, "Vorher")

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

    ; Vergrößere das Array um eine Zeile (UBound($aTest,2) = Anzahl Spalten):
    ReDim $aTest[UBound($aTest)+1][UBound($aTest, 2)]

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

    ; Trage die beiden neuen Werte mit in das Array:
    $aTest[UBound($aTest) - 1] [0] = 7
    $aTest[UBound($aTest) - 1] [1] = 8

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

    _ArrayDisplay($aTest, "Nachher")

    [/autoit]
  • Hab dein Skript mal auf einen wesentlichen Aspekt hin verkürzt - was fällt dir dabei auf?:

    Ausser dass mein Array nur einen Eintrag hat und dass das in einer Schleife abzuarbeiten ziemlich blödsinnig ist, nichts... (Zur Verteidigung: Das Array ist normal größer)

    Ich verstehe es so das du ein 2D-Array erstellen willst und gleich direkt eine Spalte mit dem Inhalt eines 1D-Arrays befüllen willst.

    Genau das möchte ich!

    Warum du in der Schleife immer ein neues Array erstellst (dim) ist mir zwar nicht klar

    Jetzt wo dus sagst: Bischen schwachsinnig, ja :pinch:

    in der 2. Dimension sollte schon eine Zahl größer 0 stehen

    Hatte irgendwie im Kopf, dass da die Zählweise von links auch bei 0 anfängt, wie bei den Spalten.

    Vielleicht zur Verständnis nochmal der angesprochene 2-Zeiler

    Ok, danke dafür. Habs jetzt glaube ich... wenigstens zum Teil...

    [autoit]

    Dim $csv[30][4]
    for $b = 1 to ubound($asoftware) - 1
    $csv[$b][1] = $asoftware[$b]
    _ArrayDisplay($csv)
    Next

    [/autoit]

    Edit: Ich möchte es jetzt nur noch so haben, dass ich die Arraygröße vorher nicht bestimmen brauche... Ich bastel mal weiter.

    Edit2: Habs jetzt so wie ich es haben wollte, danke für die Hilfe:

    [autoit]

    Dim $csv[2][4];Größe des Arrays (Sollte dynamisch angepasst werden)
    for $b = 1 to ubound($asoftware) - 1
    $csv[$b][1] = $asoftware[$b]
    ReDim $csv[ubound($asoftware) + 1][4]
    _ArrayDisplay($csv)
    Next

    [/autoit]

    3 Mal editiert, zuletzt von Scritch (5. Mai 2011 um 15:30)

  • Zitat von »AspirinJunkie«
    Hab dein Skript mal auf einen wesentlichen Aspekt hin verkürzt - was fällt dir dabei auf?:
    Ausser dass mein Array nur einen Eintrag hat und dass das in einer Schleife abzuarbeiten ziemlich blödsinnig ist, nichts...

    Führe es doch mal aus...
    Der erste ArrayIndex ist die 0 - nicht die 1.
    Bei allen For-Schleifen die ich bei dir gesehen habe ignorierst du immer das 1. Element.

    Hatte irgendwie im Kopf, dass da die Zählweise von links auch bei 0 anfängt, wie bei den Spalten.

    Wenn du auf die Werte zugreifst ist das ja richtig. Aber wenn man ein Array deklariert wird kein Index sondern die Größe angegeben.

  • Generell Probleme habe ich nicht. Das sind jetzt bloß Dinge, die mit Arrays vorher nicht angestellt habe und ich mich daher bischen mit schwer tue. Das Tut kenne ich schon, schaue auch ab und zu mal wieder rein, trotzdem danke für den Hinweis :)