Zeile in 2D Array schreiben

  • Es klingt so einfach, aber ich bekomme es nicht hin ... ich möchte eine (komplette) Zeile in einem 2D-Array an einem Stück schreiben.

    [autoit]

    ; etwas in die 0te-Zeile schreiben ist einfach
    dim $foobar[10][3] = [["Spalte1", "Spalte2", "Spalte3"]]

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

    ; etwas in die 5te Zeile schreiben wäre toll
    $foobar[5][0] = ["Spalte1", "Spalte2", "Spalte3"]
    ; geht aber nicht

    [/autoit]

    Geht so etwas überhaupt in AutoIt?

  • Sorry, aber ich verstehe nicht, was du genau willst.

    Kannst du ein Beispiel geben, z.B. eine Zeile, die in einem 2D Array abgebildet wird.

    Gruß,
    UEZ

    Auch am Arsch geht ein Weg vorbei...

    ¯\_(ツ)_/¯

  • Meinste so?

    [autoit]

    $foobar[5][0] = "Deine ganze Zeile"

    [/autoit]

    Sind TV-Quizfragen zu einfach? A) Ja B) Harry Potter

    Spoiler anzeigen

    Ich gebe zu dieser Post hat wahrscheinlich nicht viel geholfen,
    aber ich versuche wenigstens zu helfen :rolleyes:

  • Das Beispiel ist in meinem ersten Post!

    Meinste so?

    [autoit]

    $foobar[5][0] = "Deine ganze Zeile"

    [/autoit]

    Nein! Das ist Blödsinn ...
    So schreibe ich nur in der 5ten Spalte/0te Zeile in eine einzige Zelle etwas!
    Ich möchte aber eine Zeile auf einmal beschreiben!

    Mit folgender definition kann man bekanntlich die erste Zeile beschreiben, alle drei Zellen in der ersten Zeile:

    [autoit]

    dim $foobar[10][3] = [["Spalte1", "Spalte2", "Spalte3"]]

    [/autoit]

    Das System möchte ich auf andere Zeilen in einem Array übertragen ...

    Wie kann ich aber z.B. die 5te Zeile auf einmal beschreiben?
    Sodass in der 5ten Spalte die Zelle1, Zelle2 und Zelle3 beschrieben werden?
    So geht das nicht:

    [autoit]

    $foobar[5][0] = ["Spalte1", "Spalte2", "Spalte3"]

    [/autoit]


    Ich möchte also mehrere Zellen auf einmal schreiben, das hier abkürzen:

    [autoit]

    $foobar[5][0] = "Spalte0"
    $foobar[5][1] = "Spalte1"
    $foobar[5][2] = "Spalte2"

    [/autoit]


    Das soll alles in eine Quellcode-Zeile abgewickelt werden!

  • Mal ein bisschen zur Aufklärung:

    Dein "dim $foobar[10][3]" macht erst einmal nichts weiter als ein neues 2D-Array mit 10 Zeilen und 3 Spalten zu erstellen (statt Dim stattdessen lieber Global oder Local - je nach gewünschter Verwendung - benutzen).
    Wenn man dahinter direkt eine Zuweisung macht (bei dir: = [["Spalte1", "Spalte2", "Spalte3"]]) wird das Array erstellt und gleich diese Werte zugewiesen.
    Beginnend ab der ersten Zeile.
    Werden weniger Elemente zugewiesen als das Array groß ist haben die nachfolgenden Array-Elemente einen Nullstring als Wert - sie bleiben also leer.
    Diese Direktzuweisung funktioniert allerdings nur bei der Erstellung des Arrays - nicht bei schon vorhandenen Arrays.
    Wenn du also die 5. Zeile direkt mit dieser Syntax beschreiben willst geht das nur bei der Erstellung des Arrays und du musst du auch die 4 Zeilen davor mit angeben:

    [autoit]

    Global $a_Test[10][3] = [[''],[''],[''],[''],[1, 2, 3]]

    [/autoit]


    Sonst geht es nur so wie du es schon geschrieben hast.

  • Danke, aber das habe ich schon gewusste ;)

    Sonst geht es nur so wie du es schon geschrieben hast.

    Schade, dann überlege ich mir morgen mal eine andere Möglichkeit, wie ich das geschickt hingekommen kann.
    Weil ich habe gerade ein Skript, in dem ich Arrays immer mit kompletten Zeilen bearbeite und brauche dafür gefühlte Tausend Zeilen ...

    Jetzt aber erst mal 19h-Tag beenden :sleeping:

  • Dann wäre es angebracht mal konkret zu sagen was du machen willst.
    Sicherlich gibt es durchaus elegantere Methoden als ein Array direkt im Quelltext vorzubelegen.
    Dazu müssten wir aber nun genau wissen was gemacht werden soll.

    • Offizieller Beitrag

    Wenn es eleganter (und skriptsparender) sein soll, einfach die Zuweisungen in eine Funktion auslagern, dazu gibts die :D

    [autoit]

    ; statt:
    $foobar[5][0] = "Spalte0"
    $foobar[5][1] = "Spalte1"
    $foobar[5][2] = "Spalte2"

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

    ; einfach mit einer kleinen Funktion:
    _FillArrayRow($foobar, 5, "Spalte0", "Spalte1", "Spalte2")

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

    Func _FillArrayRow(ByRef $_a, $_i, $_v1, $_v2, $_v3)
    $_a[$_i][0] = $_v1
    $_a[$_i][1] = $_v2
    $_a[$_i][2] = $_v3
    EndFunc

    [/autoit]
  • @ BugFix:
    Auf die Idee bin ich auch schon gekommen ... hier mal mein delux Fkt. ;)

    [autoit]

    dim $foobar[2][2]
    _Array2D_Inset("Spalte0|Spalte1|Spalte2", $foobar, 5)
    _Array2D_Inset("Spalte0|Spalte1|Spalte2", $foobar, 3, 1)

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

    ; Zeile zu Array hinzufügen
    Func _Array2D_Inset($string, byref $array, $zeile = 0, $spalte = 0, $trenner = "|")
    $temp = StringSplit($string, $trenner) ; String teilen

    ; Testen ob Anzahl der Zeilen ok
    if $zeile+1 > UBound($array, 1) then
    redim $array[$zeile+1][UBound($array, 2)]
    endif

    ; Testen ob Anzahl der Spalten ok
    if $temp[0]+$spalte > UBound($array, 2) then
    redim $array[UBound($array, 1)][$temp[0]+$spalte]
    endif

    ; Zellen in Array schreiben
    for $x=0 to $temp[0]-1
    $array[$zeile][$x+$spalte] = $temp[$x+1]
    next
    EndFunc

    [/autoit]
  • Schreib doch mal für welchen konkreten Anwendungsfall du das benötigtest. Vielleicht ist es ja gar nicht nötig alles direkt in den quelltext zu schreiben.

    In meinem konkreten Fall geht es um Positionen von Labels und Buttons:

    Spoiler anzeigen
    [autoit]

    #include-once

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

    ; Allegemein GUI Variablen
    $gui_schrift_groesse = -1; 10
    $gui_schrift_breite = -1 ;400
    $gui_schrift_art = -1 ;"Calibri"

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

    $gui_db_x = 980
    $gui_db_y = 570
    $abstand_titel = 40
    $abstand_oben = 50

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

    $anz_ebenen = 50
    dim $knopf_db[$anz_ebenen][4]

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

    ; Blind-Text für den Inhalt
    dim $text[$anz_ebenen][7] = [["Name", "Container", "Codec", "Gesehen", "Genre", "Punkte1", "Punkte2"]]

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

    $abstand_std = 10

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

    $ebene_x = $abstand_std
    $ebene_y = $abstand_std
    $ebene_gx = $gui_db_x-2*$abstand_std-16
    $ebene_gy = 21

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

    $text_x = 0
    $text_y = ($ebene_gy-17)
    $text_gx = 30
    $text_gy = 17

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

    $text2_x = $text_x+$text_gx+$abstand_std
    $text2_y = $text_y
    $text2_gx = 200+119
    $text2_gy = 17

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

    $text3_x = $text2_x+$text2_gx+$abstand_std
    $text3_y = $text_y
    $text3_gx = 50
    $text3_gy = 17

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

    $text4_x = $text3_x+$text3_gx+$abstand_std
    $text4_y = $text_y
    $text4_gx = 50
    $text4_gy = 17

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

    $text5_x = $text4_x+$text4_gx+$abstand_std
    $text5_y = $text_y
    $text5_gx = 45
    $text5_gy = 17

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

    $text6_x = $text5_x+$text5_gx+$abstand_std
    $text6_y = $text_y
    $text6_gx = 30
    $text6_gy = 17

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

    $text7_x = $text6_x+$text6_gx+$abstand_std
    $text7_y = $text_y
    $text7_gx = 45
    $text7_gy = 17

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

    $text8_x = $text7_x+$text7_gx+$abstand_std
    $text8_y = $text_y
    $text8_gx = 45
    $text8_gy = 17

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

    $button_x = $text8_x+$text8_gx+$abstand_std
    $button_y = 0
    $button_gx = 60
    $button_gy = $ebene_gy

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

    $button2_x = $button_x+$button_gx+$abstand_std
    $button2_y = 0
    $button2_gx = 50
    $button2_gy = $ebene_gy

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

    $button3_x = $button2_x+$button2_gx+$abstand_std
    $button3_y = 0
    $button3_gx = 60
    $button3_gy = $ebene_gy

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

    $button4_x = $button3_x+$button3_gx+$abstand_std
    $button4_y = 0
    $button4_gx = 50
    $button4_gy = $ebene_gy

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

    if $button4_x+$button4_gx <> $ebene_gx and $debug = 2 then
    MsgBox(0, "", "Rest: " & $button4_x+$button4_gx-$ebene_gx & "px")
    endif

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

    $gui_db = GUICreate($titel, $gui_db_x, $gui_db_y, -1, -1)
    GUISetFont($gui_schrift_groesse, $gui_schrift_breite, -1, $gui_schrift_art)

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

    GUICtrlCreateLabel("Bibliotheca", 200, 10, 505, $abstand_titel-10, $SS_CENTER)
    GUICtrlSetFont(-1, 20, 800, 0, "MS Sans Serif")
    ;GUISetBkColor(0xc0d8f1)

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

    For $ebene = 0 To $anz_ebenen-1
    $scroll = ($abstand_oben+$ebene_y+($ebene_gy+$ebene_y)*($ebene+1))/16.5
    If $scroll > 32780 or $ebene >= 500 Then ; Die Labels werden nur auf einer Länge von ca.32780px erstellt
    MsgBox(0, "Fehler, Ebene #" & $ebene, "Die Scollbar ist zu lang!")
    ExitLoop
    EndIf

    GUICtrlCreateLabel("#" & $ebene+1, $ebene_x+$text_x, $abstand_oben+$ebene_y+($ebene_gy+$ebene_y)*$ebene+$text_y, $text_gx, $text_gy)
    GUICtrlCreateLabel($text[$ebene][0], $ebene_x+$text2_x, $abstand_oben+$ebene_y+($ebene_gy+$ebene_y)*$ebene+$text2_y, $text2_gx, $text2_gy)
    GUICtrlCreateLabel($text[$ebene][1], $ebene_x+$text3_x, $abstand_oben+$ebene_y+($ebene_gy+$ebene_y)*$ebene+$text3_y, $text3_gx, $text3_gy)
    GUICtrlCreateLabel($text[$ebene][2], $ebene_x+$text4_x, $abstand_oben+$ebene_y+($ebene_gy+$ebene_y)*$ebene+$text4_y, $text4_gx, $text4_gy)
    GUICtrlCreateLabel($text[$ebene][3], $ebene_x+$text5_x, $abstand_oben+$ebene_y+($ebene_gy+$ebene_y)*$ebene+$text5_y, $text5_gx, $text5_gy)
    GUICtrlCreateLabel($text[$ebene][4], $ebene_x+$text6_x, $abstand_oben+$ebene_y+($ebene_gy+$ebene_y)*$ebene+$text6_y, $text6_gx, $text6_gy)
    GUICtrlCreateLabel($text[$ebene][5], $ebene_x+$text7_x, $abstand_oben+$ebene_y+($ebene_gy+$ebene_y)*$ebene+$text7_y, $text7_gx, $text7_gy)
    GUICtrlCreateLabel($text[$ebene][6], $ebene_x+$text8_x, $abstand_oben+$ebene_y+($ebene_gy+$ebene_y)*$ebene+$text8_y, $text8_gx, $text8_gy)

    $knopf_db[$ebene][0] = GUICtrlCreateButton("Filmstarts", $ebene_x+$button_x, $abstand_oben+$ebene_y+($ebene_gy+$ebene_y)*$ebene+$button_y, $button_gx, $button_gy)
    ;GUICtrlSetBkColor(-1, 0x99b9e3)
    $knopf_db[$ebene][1] = GUICtrlCreateButton("IMDB", $ebene_x+$button2_x, $abstand_oben+$ebene_y+($ebene_gy+$ebene_y)*$ebene+$button2_y, $button2_gx, $button2_gy)
    ;GUICtrlSetBkColor(-1, 0x99b9e3)
    $knopf_db[$ebene][2] = GUICtrlCreateButton("starten", $ebene_x+$button3_x, $abstand_oben+$ebene_y+($ebene_gy+$ebene_y)*$ebene+$button3_y, $button3_gx, $button3_gy)
    ;GUICtrlSetBkColor(-1, 0x99b9e3)
    $knopf_db[$ebene][3] = GUICtrlCreateButton("mehr", $ebene_x+$button4_x, $abstand_oben+$ebene_y+($ebene_gy+$ebene_y)*$ebene+$button4_y, $button4_gx, $button4_gy)
    ;GUICtrlSetBkColor(-1, 0x99b9e3)
    Next

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

    ; Scroll-Leiste initialisieren
    crys_scroll()

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

    _GUIScrollBars_Init($gui_db, -1, $scroll) ; Scrollbars werden im Fenster initialisiert|
    ;Länge horizontal = 0 |Länge vertikal = ($abstand_oben + ($ebene * 50)) / 16 => Abhängig von der Anzahl der Labels
    ;_GUIScrollBars_ShowScrollBar($gui_db, $SB_HORZ, False) ; Horizontale Scrollbar wird deaktiviert

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

    if $debug = 2 then
    GUISetState(@SW_SHOW, $gui_db)

    while 1
    if GUIGetMsg() = $GUI_EVENT_CLOSE then exit
    wend
    exit
    endif

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

    ; ### ENDE ###

    [/autoit]

    Zeile 26 bis 84 und Zeile 104 bis 120 kann man schon zusammen fassen, wenn die Daten nicht in je einem String gespeichert werden, sondern in einem Array!

    Weiß ich nicht, verstehe nicht ganz, was das in meinem Fall bringt ...

  • Da ich deinen Fall nicht verstehe, habe ich mir gedacht, dass du vllt. sowas suchst - war ein Versuch wert.

    Versuche konkret zu beschreiben, was du willst, ansonsten raten wir nur rum!

    Gruß,
    UEZ

    Auch am Arsch geht ein Weg vorbei...

    ¯\_(ツ)_/¯

  • Da ich deinen Fall nicht verstehe, habe ich mir gedacht, dass du vllt. sowas suchst - war ein Versuch wert.
    Versuche konkret zu beschreiben, was du willst, ansonsten raten wir nur rum!

    Wie im letzten Post beschrieben: ganz viele Größen und Positionen von GUI-Elementen in ein Array packen, damit man per Schleife an die Daten kommt!

    Ist aber auch egal ... ich habs ja schon gelöst, mit der Fkt. die ich oben gepostet habe.
    Hatte nur noch nicht den Thread als gelöst markiert :whistling:

    Abgeändertes Code-Beispiel
    [autoit]

    #include-once

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

    ; zu Schrift
    $gui_schrift_groesse = -1; 10
    $gui_schrift_breite = -1 ;400
    $gui_schrift_art = -1 ;"Calibri"

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

    ; GUI Größen
    $gui_db_x = 980
    $gui_db_y = 570

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

    ; Verschiedene Abstände
    $abstand_titel = 40
    $abstand_oben = 50
    $abstand_unten = 50
    $abstand_std = 10

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

    ; Wie groß die Tabelle wird
    $anz_spalten = 12
    $anz_ebenen = 50
    dim $knopf_db[$anz_ebenen][4]
    dim $text_db[$anz_ebenen][$anz_spalten]

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

    ; Spalten Überschriften
    dim $text_erste[$anz_spalten] = ["Lfd.", "Name", "Container", "Codec", "Gesehen", "Genre", "Punkte1", "Punkte2", "Filmstarts", "IMDB", "starten", "mehr"]
    $text_erste_y = $abstand_oben-12 ; Abstand für die erste Zeile

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

    ; Blind-Text generieren
    for $ebene = 0 to $anz_ebenen-1
    for $n=0 to 11
    $text_db[$ebene][$n] = "#"&$ebene+1&"/"&$n+1
    next

    ; Beschriftungen der Knöpfe
    crys_array_add_zeile("Filmstarts|IMDB|starten|mehr", $text_db, $ebene, 8)
    next
    ;_ArrayDisplay($text_db)

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

    ; Wo welche Ebene beginnt
    dim $m_ebene[4]
    $m_ebene[0] = $abstand_std
    $m_ebene[1] = $abstand_std
    $m_ebene[2] = $gui_db_x-2*$abstand_std-16
    $m_ebene[3] = 21

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

    ; Positionen und Größen der einzelnen Zellen
    dim $m_text[$anz_spalten][4]
    crys_array_add_spalte("30|319|50|50|45|30|45|45|60|50|60|50", $m_text, 0, 2) ; Belibige x-Größen
    for $n=0 to 11
    if $n=0 then
    $m_text[0][0] = 0 ; x-Abstand
    $m_text[$n][1] = $abstand_std ; y-Abstand
    else
    $m_text[$n][0] = $m_text[$n-1][0]+$m_text[$n-1][2]+$abstand_std
    $m_text[$n][1] = $m_text[$n-1][1]
    endif

    ;$m_text[$n][2] = 10 ; x-Größe
    $m_text[$n][3] = 17 ; y-Größe
    next
    crys_array_add_spalte("0|0|0|0", $m_text, 8, 1) ; Knöpfe weiter oben beginnen
    crys_array_add_spalte($m_ebene[3]&"|"&$m_ebene[3]&"|"&$m_ebene[3]&"|"&$m_ebene[3], $m_text, 8, 3) ; Höhere Knöpfe
    ;_ArrayDisplay($m_text)

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

    ; Kleiner Test ob das Layout ausgenutzt ist
    if $m_text[11][0]+$m_text[11][2] <> $m_ebene[2] and $debug = 2 then
    MsgBox(0, "", "Rest: " & $m_text[11][0]+$m_text[11][2]-$m_ebene[2] & "px")
    endif

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

    ; GUI starten
    $gui_db = GUICreate($titel, $gui_db_x, $gui_db_y, -1, -1)
    GUISetFont($gui_schrift_groesse, $gui_schrift_breite, -1, $gui_schrift_art)

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

    ; Hauptüberschrift
    GUICtrlCreateLabel("Bibliotheca", 200, 10, 505, $abstand_titel-10, $SS_CENTER)
    GUICtrlSetFont(-1, 20, 800, 0, "MS Sans Serif")
    ;GUISetBkColor(0xc0d8f1)

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

    ; Spalten Überschriften ausgeben
    for $n=0 to 11
    GUICtrlCreateLabel($text_erste[$n], $abstand_std+$m_text[$n][0], $text_erste_y, $m_text[$n][2], $m_text[$n][3])
    next

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

    ; Scroll-GUI starten
    $gui_db_scroll = GUICreate("", $gui_db_x, $gui_db_y-$abstand_oben-$abstand_unten, 0, $abstand_oben, BitOR($WS_POPUP, $WS_GROUP, $WS_VSCROLL, $WS_CLIPSIBLINGS), $WS_EX_MDICHILD, $gui_db)
    ;GUISetBkColor(0xc0d8f1)

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

    ; Ebene für Ebene ausgeben
    For $ebene = 0 To $anz_ebenen-1
    $scroll = ($m_ebene[1]+($m_ebene[3]+$m_ebene[1])*($ebene+1))/16
    If $scroll > 32780 or $ebene >= 500 Then ; Die Labels werden nur auf einer Länge von ca.32780px erstellt
    MsgBox(0, "Fehler, Ebene #" & $ebene, "Die Scollbar ist zu lang!")
    ExitLoop
    EndIf

    ; Schrift ausgeben
    for $n=0 to 7
    if $n=0 then
    $inhalt = "#" & $ebene+1 ; Lfd.-Nr.
    else
    $inhalt = $text_db[$ebene][$n-1]
    endif
    GUICtrlCreateLabel($inhalt, $m_ebene[0]+$m_text[$n][0], $m_ebene[1]+($m_ebene[3]+$m_ebene[1])*$ebene+$m_text[$n][1], $m_text[$n][2], $m_text[$n][3])
    next

    ; Knöpfe ausgeben
    for $n=8 to 11
    $inhalt = $text_db[$ebene][$n]
    $knopf_db[$ebene][0] = GUICtrlCreateButton($inhalt, $m_ebene[0]+$m_text[$n][0], $m_ebene[1]+($m_ebene[3]+$m_ebene[1])*$ebene+$m_text[$n][1], $m_text[$n][2], $m_text[$n][3])
    ;GUICtrlSetBkColor(-1, 0x99b9e3)
    next
    Next

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

    ; Scroll-Leiste initialisieren
    crys_scroll()
    _GUIScrollBars_Init($gui_db_scroll, -1, $scroll) ; Scrollbars werden im Fenster initialisiert|
    _GUIScrollBars_ShowScrollBar($gui_db_scroll, $SB_HORZ, False) ; Horizontale Scrollbar wird deaktiviert
    ;Scrollbar_Create($gui_db_scroll, $SB_VERT, $scroll)
    ;Scrollbar_Step(20, $Group1, $SB_VERT)

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

    ; Auf Haupt-GUI wechseln
    GUISwitch($gui_db)

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

    if $debug = 2 then
    GUISetState(@SW_SHOW, $gui_db)
    GUISetState(@SW_SHOW, $gui_db_scroll)

    while 1
    if GUIGetMsg() = $GUI_EVENT_CLOSE then exit
    wend
    exit
    endif

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

    ; ### ENDE ###

    [/autoit]

    Danke für eure Hilfe :thumbup: