array mit _arrayadd adden?

  • ich habe ein array erzeugt (1D) und wollte nun mit _arrayadd subarrays hinzufügen (es auf 2D erweitern), _arraydisplay gibt mir dann aber ein 1D-Array mit leeren einträgen aus.
    erzeuge ich das array, zu dem ich hinzufüge, 2d, so ändert das auch nichts....

    kann man in autoit auf diese weise kein 2D-array erzeugen?

    muss ich also, wenn ich ein 2dimensionales array verwenden will, die dimensionen schon beim erstellen wissen und kann diese nicht dynamisch ändern?

    2 Mal editiert, zuletzt von LilProgger208 (4. September 2008 um 18:54)

  • [autoit]

    #include <array.au3>
    Dim $display_array[1]
    ;_ArrayDisplay($display_array)
    For $i = 0 To 6
    $value1 = "test" & $i
    $value2 = "text"
    Dim $array[2]
    $array[0] = $value1
    $array[1] = $value2
    _ArrayAdd($display_array, $array)
    Next

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

    _ArrayDisplay($display_array)

    [/autoit]


    das ist funktional der teil des codes um den es geht

    btw: ich weiß, das cih mir hier $value1 und $value2 sparen kann, im richtigen code gibts da jedoch abhängige ausdrücke (if), die die werte festlegen und der übersicht halber habe ich das dann so angeordnet

    • Offizieller Beitrag
    [autoit]

    #include <array.au3>
    Dim $display_array[1]
    ;_ArrayDisplay($display_array)
    For $i = 0 To 6
    $value1 = "test" & $i
    $value2 = "text"
    Dim $array[2]
    $array[0] = $value1
    $array[1] = $value2
    _ArrayAdd($display_array, $array)
    Next
    For $i = 0 To 6
    $test = $display_array[$i]
    _ArrayDisplay($test)
    Next

    [/autoit]

    Mega

  • aber da die funktionen da nicht funktionieren macht das so wohl auch wenig sinn - gut, Frage ist jedenfalls geklärt

  • Wieso funktionieren die Funktionen da denn nicht?
    Das ist alles normal.
    Das einzige was bei dir nicht gehen kann ist das Ergebnis mit _Arraydisplay anzuzeigen - aber das ist absolut logisch.
    Weil dabei keine feste Struktur herauskommt sondern diese in den einzelnen Elementen variabel sein kann.
    Bei einem Array in Array kann z.B. das 1. Element ein 1 Dimensionales Array mit 16 Elementen sein und das 2. Element ist dann z.B. gleich ein 3D-Array!
    Wie willst du das denn bitte darstellen?
    Bei einem 2D-Array ist das kein Problem weil da ja die Anzahl der Elemente und ihre Dimension bei jedem Element fest und gleich ist.

    Du kannst genauso die Array-Funktionen zum adden nehmen wenn du ein Array im Array bauen willst:

    Array in Array ohne Array-UDF:

    [autoit]

    Dim $Array[5]

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

    For $i = 1 To 5
    Dim $TempArray[3] = [$i, $i^2, $i^3]
    $Array[$i - 1] = $TempArray
    Next

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

    For $i In $Array
    ConsoleWrite($i[0] & @TAB & $i[1] & @TAB & $i[2] & @CRLF)
    Next

    [/autoit]

    Array in Array mit Array-UDF:

    [autoit]


    Dim $TempArray[3] = [0,0,0]
    Dim $Array[1] = [$TempArray]

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

    For $i = 1 To 5
    Dim $TempArray[3] = [$i, $i^2, $i^3]
    _ArrayAdd($Array, $TempArray)
    Next

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

    For $i In $Array
    ConsoleWrite($i[0] & @TAB & $i[1] & @TAB & $i[2] & @CRLF)
    Next

    [/autoit]
  • scheint aber dann ja ne andere struktur zu haben - das array was ich zusammengebatelt habe hat ja fixe dimensionen (dimension der subarrays ist 2)

  • Ja, das sind verschiedene Strukturen.
    2DArray:
    Array[Dim1][Dim2]

    Array of Arrays:
    Array[Dim1] -> Array[Dim2]

  • Natürlich.
    Bei dir mag das fix sein - aber das muss nicht sein und die _Arraydisplay-Methode hat keine Möglichkeit das vorher zu wissen.
    Bei einem Array stehen alle Elemente eines gleichen Typs hintereinander im Speicher.
    Jedes Element belegt die selbe Größe im Speicher.
    Wenn das gegeben ist kann mit einem Index darauf zugegriffen werden.
    Wenn die Elementgröße des Arrays z.B. 16 Byte groß ist dann bedeutet der Zugriff "$Array[5]":
    Geh zur Speicheradresse des Anfangs des Arrays, gehe dann 80 Byte weiter (5 * 16 Byte) und von da ab in diesen 16 Byte steht der Wert des 6. Elementes des Arrays.
    Bei einem 2D-Array ist das nicht anders.
    Dort ist halt nur das Element nochmal in Unterelemente unterteilt (halt ein Array).
    Die Elemente müssen aber trotzdem noch die selbe Größe haben sonst klappt das nicht.
    Deswegen haben bei einem 2D-Array die Unterelemente immer die selbe Größe.

    Bei einem Array in Array sieht das wieder ganz anders aus:
    Das Array enthält als Elemente nicht die Unterarrays selber sondern lediglich einen Verweis wo die Unterarrays im Speicher stehen.
    Von dort aus kann man dann die einzelnen Unterlemente anwählen.
    Allerdings hat man in diesem Fall keine Information über Größe und Dimension eines einzelnen Elementes weswegen eine korrekte Indizierung der Unterelemente auf diesem Wege nicht möglich ist.

    Kurz und knapp:
    So wie du dir das vorstellst wirst du keine 2D-Arrays erstellen können - das ist eine völlig andere Struktur.
    Die Elemente stehen nicht wie bei einem Array hintereinander im Speicher!
    Wie kommst du eigentlich darauf?
    Weil auch in anderen Programmiersprachen ist das nicht wirklich anders.

  • Ich glaube, bei ein paar Sprachen geht es, aber die verwenden intern eben auch Array of Arrays, nur der Zugriff funktioniert wie be einem normalen 2d-Array

  • Hab sehr lange nichts mehr mit Java zu tun gehabt (hatte das auch nur ein Semester).
    Kannst du mal bitte ein Beispielcode dazu posten?
    Mag sein das man ein 1D-Array in Array über die Syntax "Array[j][k]" in Java ansprechen kann.
    Das entspricht aber dann auch unter Java NICHT einem 2D-Array - das ist auch dort noch ein absoluter Unterschied auch wenn es im Code gleich aussieht.
    Denn auch dort sind die Unterelemente nicht fester Größe und liegen nicht hintereinander im Speicher (was auch bei JAVA bei 2D-Arrays der Fall ist).
    Wenn man das so macht kann es sehr schnell zu einer falschen Indizierung kommen eben weil die Unterelemente unterschiedlicher Dimensionierung sein können.

    Auch in Java ist ein Array in Array nicht gleich einem 2D-Array.
    (dürfte auch unwesentlich langsamer sein)

    2 Mal editiert, zuletzt von AspirinJunkie (4. September 2008 um 16:44)

  • Du blamierst dich nicht - du hast Recht.
    Hab das nochmal nachgelesen.

    So gesehen gibt es in Java also gar keine mehrdimensionalen Arrays sondern lediglich jagged-Arrays.
    Von C, C# und AutoIt ( ;) ) weiß ich das dort zwischen den beiden Formen noch unterschieden wird.

    @LilProgger208

    Kurz und knapp nochmal zusammengefasst:
    Es ist kein Versäumnis von AutoIt das die Array-Funktion nicht alle auf ein Array of Arrays anwendbar sind - eben weil es eine andere Struktur darstellt.
    Wenn du sagst das deine übergebenen Arrays immer fix auf 2 Elemente sind warum deklarierst du dann nicht gleich ein 2D-Array mit 2 Elementen in der 2. Dimension?

    3 Mal editiert, zuletzt von AspirinJunkie (4. September 2008 um 16:50)

  • da kann man aber trotzdem nicht mit array_add arbeiten, oder?
    Soweit ich das sehe/verstehe bleibt für ein "echtes" 2D-Array nur die möglichkeit, es von vornherein in voller dimension zu deklarieren, oder?

  • Doch du kannst trotzdem mit _ArrayAdd arbeiten um ein Jagged-Array zu erhalten.
    Siehst du doch im Beispiel von Xeno und von mir.
    Es wird per ArrayAdd ja nicht das Array selbst übergeben sondern nur lediglich ein Verweis wo das Array im Speicher steht.
    Du hast dann im Ergebnis ein Array von Pointern auf Arrays - genau das was du willst.
    Es ist aber dann kein 2D-Array und kann entsprechend nicht mit Funktionen verwendet werden die innerhalb der 2. Dimension eines normalen 2D-Arrays arbeiten (z.B. eben _ArrayDisplay).

    Wenn du ein 2D-Array haben willst musst du die Dimensionen vorher deklarieren.
    Oder du arbeitest halt mit ReDim was aber gerade bei großen Arrays nicht wirklich ratsam ist.
    Da du ja schreibst das du eh immer eine fixe Anzahl an Elementen in der "2. Dimension" hast sollte es aber ja auch kein Problem sein das Array vorher entsprechend zu dimensionieren.

    Edit: Oder verstehe ich dich gerade falsch und du meinst das man mit _ArrayAdd keine 2D-Arrays erweitern kann?
    Das wäre dann richtig - _ArrayAdd kann nur mit 1D-Arrays umgehen.
    Für den Fall das du unbedingt eine Add-Funktion willst brauchst kannst du dir aber eine selber schreiben.
    Müsste es aber schon entsprechende Funktionen geben (denk mal BugFix wird sowas schon gemacht haben oder so).

    Einmal editiert, zuletzt von AspirinJunkie (4. September 2008 um 19:36)

  • Ein "echtes" 2D-Array mit 2 Werten pr Datensatz musst du so deklarieren:

    [autoit]

    Dim $2dArray[1][2]
    ;zugriff:
    $wert = $2dArray[0][1]

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

    ;Erweitern um neue Datensätze:
    ; by Prog@ndy
    Func _Array2DAdd(ByRef $array,$Value1,$Value2)
    If Not IsArray($array) Then
    Dim $array[1][2] = [$Value1,$Value2]
    Return 1
    EndIf
    If UBound($array,2) <> 2 Then Return SetError(1,0,0)
    ReDim $array[UBound($array)+1][2]
    $array[UBound($array)-1][0] = $Value1
    $array[UBound($array)-1][1] = $Value2
    Return 1
    EndFunc

    [/autoit]