Variierende Anzahl von Dimensionen in einem Array

  • Ich habe ein Problem beim Deklarieren eines Arrays welches unterschiedlich viele Dimensionen haben kann. :pinch:
    Ich habe es mit Execute versucht aber das klapt net.

    [autoit]


    Execute("Dim $Array"&$ArrayForm)

    [/autoit]


    Wobei $ArrayForm z.B. [2][5][3] sein kann oder auch was anderes.

    Ich möchte nähmlich ein Script schreiben welches etwas bestimmtes in ein Array umwandelt, aber ich weis voher nicht welche Dimensionen es hat. :wacko:

    Jetzt schon vielen dank an mögliche Helfer :D

    mfg
    Zeitriss

    Einmal editiert, zuletzt von Zeitriss (7. November 2010 um 01:15)

  • _ArrayAdd - fügt keine Dimensionen hinzu also bringt mir das nichts
    StringSplit - hilft vll beim zusammenstellen des Arrays aber beim Deklarieren ist es keine große Hilfe
    ReDim - Werd ich mal schauen hab aber keine großen hoffnungen das es das is was ich suche [Edit:] ist nicht das was ich suche

    Das Array kann zwischen 1und 64 Dimensionen haben wobei ich nichts genaueres weiß und ich habe keine Lust alle möglichkeiten vorzuprogrammieren
    z.B.

    [autoit]


    if $Dimensionen = 1 Then
    Dim $Varriable[$Wert1]
    ElseIf $Dimensionen = 2 Then
    Dim $Varriable[$Wert1][$Wert2]
    ElseIf $Dimensionen = 3 Then
    Dim $Varriable[$Wert1][$Wert2][$Wert3]
    usw...

    [/autoit]

    dass muss doch anders gehen :(

  • Zitat

    Ich möchte nähmlich ein Script schreiben welches etwas bestimmtes in ein Array umwandelt, aber ich weis voher nicht welche Dimensionen es hat.

    Wenn du von irgendwoher Informationen einliest kannst du doch daraus ein passendes Array deklarieren. Wäre vlt. hilfreich zu wissen, was da woher kommt.

    edit: nie 3 Tabs auf einmal lesen sonst ist man irgendwo zu spät dran.

  • Ich habe einen String den eine Funktion zurück gibt, diese Funktion wandelt ein Array in ein String um, und ich wollte den String wieder in ein Array verwandeln. Leider kriege ich das Deklarieren des Arrays nicht hin.

    hier die Funktion welche ein Array in ein String umwandelt:

    Spoiler anzeigen
    [autoit]


    Func ArraytoString($Array)
    If Not IsArray($Array) Then Return -1
    $String = "<;Array;>"
    $Info = ""
    For $i = 1 to UBound($Array,0)
    $Info &= UBound($Array,$i) - 1&"|"
    next
    $Info = StringSplit(StringTrimRight($Info,1),"|")
    Dim $X[$Info[0]]
    For $i = 0 to $Info[0] - 1
    $X[$i] = 0
    next
    While 1
    $ArrayForm = ""
    For $i = 0 to $Info[0] - 1
    $ArrayForm &= "["&$X[$i]&"]"
    next
    $String &= "<;"&$ArrayForm&";>"&Execute("$Array"&$ArrayForm)

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

    $X[$Info[0]-1] += 1
    For $i = $Info[0]-1 to 1 step - 1
    If $X[$i] >$Info[$i + 1] Then
    $X[$i] = 0
    $X[$i - 1] += 1
    EndIf
    next
    If $X[0] > $Info[1] Then Return $String&"<;"
    WEnd
    EndFunc

    [/autoit]
  • Naja, wenns nur ums dimensionieren geht, würd ich das mit StringRegExp machen. Ich kanns zwar nicht, aber es ist garantiert möglich. Du musst dir vom String zuerst alle Zahlen zurückgeben lassen, die zwischen zwei eckigen Klammern stehen.
    Dann musst du herausfinden, wieviele eckige Klammern hintereinander stehen => Die Zahl wieviel Dimensionen du hast
    Angenommen, du hast 3 Dimensionen => bei der 1. zahl beginnen und jede 3. Zahl hernehmen bis es keine 3. mehr gibt und schauen welche die größte ist => 1. Dimensionsgröße
    dann um 1 Zahl versetzt anfangen und wieder jede 3. Zahl nehmen bis es keine 3. mehr gibt => 2. Dimensionsgröße usw..

  • Wenn du doch nur die Dimensionen willst kannst du doch UBound nehmen.

    [autoit]

    UBound($Array, 0)

    [/autoit]
  • Ich möchte nur ein Array Deklarieren bei dem ich vorher nicht weis wie viele Dimensionen es hat.
    Ich kann ohne Probleme heraus finden wie viele Dimensionen das Array hat aber ich kann ja schlecht sagen dass der Benützer das Script für jede Dimension Anzahl um schreibt.
    Normalerweise würde ich ja ein Array so deklarieren:

    [autoit]


    Dim $Array[5]

    [/autoit]


    oder so:

    [autoit]


    Dim $Array[5][3][2]

    [/autoit]

    Aber wie deklariere ich ein Array wo ich beim Programmieren noch nicht weiß wie viele Dimensionen es hat.


    ES GEHT NUR UMS DEKLARIEREN!!!
    Nicht um das zusammenstellen, dass kriege ich gut alleine hin.

    [Edit:] oetzn: Diese Methode benütze ich schon aber was mache ich dann mit der Varriable($Array) um sie zu Deklarieren

  • Ich brauche ein 3 oder mehrdimensionales Array, weil ich ein paar Funktionen schreiben möchte mit denen man unter anderem Arrays in einer Datei abspeichern kann.
    Da ist es nicht so doll wenn es auf 1-2 Dimensionen begrenzt ist :D .

  • Ich möchte aber eine Funktion schreiben bei der man Arrays in einer Datei abspeichern kann und auch wieder benützen kann das heist den String zurück in ein Array verwandeln.
    Ich möchte nicht ein Array in deine Datei tun und eine Liste oder was ähnliches herausbekommen sondern ein Array!!!

    Zitat

    aber bei Bedarf ein Array mit einer weiteren Dimension deklarieren

    Genau da liegt bei mir das Problem könnte mir mal jemand ein Beispiel schicken wie man ein Array Deklariert, wobei in einer Varriable steht wie viele Dimensionen man hat.

  • Zitat

    könnte mir mal jemand ein Beispiel schicken wie man ein Array Deklariert, wobei in einer Varriable steht wie viele Dimensionen man hat.


    Ich glaube nicht, dass das geht... Kannst du uns nicht einfach sagen wofür genau du das brauchst oder mal ein Beispiel schreiben?

  • Zitat

    Kannst du uns nicht einfach sagen wofür genau du das brauchst

    Ich habe es doch schon gesagt weil ich ein Array welches mit der Funktion (weiter oben) in ein String verwandelt wurde, wieder in ein Array umwandeln möchte.

    Zitat

    oder mal ein Beispiel schreiben

    Ich habe so versucht aber so klappt es net

    Spoiler anzeigen
    [autoit]


    $ArrayForm = ""
    $Dimension = 5
    Dim $Dimension[5] = [4,2,3,4,3]
    For $i = 1 to $Dimension[0]
    $ArrayForm &="["&$Dimension[$i]&"]"
    next
    Execute("Dim $Array"&$ArrayForm)

    [/autoit]
  • Mir fällt momentan nur folgende aufwendige Lösung ein:

    Spoiler anzeigen
    [autoit]

    #include "Array.au3"

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

    $sStr = "Test[2][4]"

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

    $aRgExp = StringRegExp($sStr, '\[(\d+)\]', 3)

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

    Switch UBound($aRgExp)
    Case 1
    Global $Array[$aRgExp[0]]
    Case 2
    Global $Array[$aRgExp[0]][$aRgExp[1]]
    Case 3
    Global $Array[$aRgExp[0]][$aRgExp[1]][$aRgExp[2]]
    Case 4
    Global $Array[$aRgExp[0]][$aRgExp[1]][$aRgExp[2]][$aRgExp[4]]
    ;Case ...
    ;Global $Array[$aRgExp[0]][$aRgExp[1]][$aRgExp[2]][$aRgExp[4]][...]
    Case Else
    MsgBox(0, "", "Mehrdimensional oder kein Match im String gefunden")
    EndSwitch

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

    _ArrayDisplay($Array)

    [/autoit]


    Ansonsten schließe ich mich name22 an und meine wenn man auf mehr als 3 Dimensionen beim Array kommt überlegen sollte ob ein Array für diesen Anwendungsfall wirklich die vernünftigste Datenstruktur ist.