Array Index hoch- bzw. runterzählen

  • Hallo liebe Community,

    ich habe mal wieder eine Frage:

    Kann ich den Array Index irgendwie auslesen und damit rechnen? Konkret möchte ich nämlich, dass wenn ein + oder ein - Button gedrückt wird, eben das nächste oder vorherige Element eines Arrays auf einer Variablen gespeichert wird.

    Beispiel (zu umständlich, da jede Möglichkeit einzeln geschrieben werden muss):

    [autoit]


    Case $ch = $CHP[1] & '+'
    Return $CHP[2]
    Case $ch = $CHP[1] & '-'
    Return $CHP[0]
    Case $ch = $CHP[2] & '+'
    Return $CHP[3]
    Case $ch = $CHP[2] & '-'
    Return $CHP[1]

    [/autoit]

    Ich könnte das auch noch separat in zwei verschiedene Funktionen packen, aber grundsätzlich ist mein Beispiel das, was ich allgemein bräuchte, also ohne jede Möglichkeit einzeln in ein Case zu scheiben.

    Er soll halt einfach das nächste oder vorherige Element auf eine Variable schreiben, solange das Array-Minimum bzw. -Maximum nicht unter- bzw. überschritten wird.

    Ich hoffe, ihr habt eine Idee. Ich habe schon überall gesucht, habe aber nur gefunden, wie man Arrays in einer Schleife befüllt, aber das wusste ich ja schon und ist auch eine ganz andere Sache als ich sie bräuchte...

  • Spoiler anzeigen
    [autoit]

    #include <Array.au3>

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

    Global $a_Array[10], $h_ButtonP, $h_ButtonM, $h_List, $s_Read

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

    GUICreate('', 330, 170)
    $h_List = GUICtrlCreateList('', 10, 10, 200, 150)
    $h_ButtonP = GUICtrlCreateButton('+', 220, 10, 100, 20)
    $h_ButtonM = GUICtrlCreateButton('-', 220, 40, 100, 20)

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

    For $i = 0 To UBound($a_Array) - 1
    $a_Array[$i] = Random(100, 999, 1)
    Next
    _ArraySort($a_Array)
    For $i = 0 To UBound($a_Array) - 1
    GUICtrlSetData($h_List, $a_Array[$i] & '|')
    Next

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

    GUISetState(@SW_SHOW)

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

    While True
    Switch GUIGetMsg()
    Case -3
    Exit
    Case $h_ButtonP
    $s_Read = GUICtrlRead($h_List)
    If $s_Read = '' Then
    ContinueLoop
    Else
    For $i = 0 To UBound($a_Array) - 1
    If $s_Read = $a_Array[$i] Then
    If $i < UBound($a_Array) - 1 Then
    MsgBox(64, '+', $a_Array[$i + 1])
    Else
    MsgBox(16, '=', $a_Array[$i])
    EndIf
    EndIf
    Next
    EndIf
    Case $h_ButtonM
    $s_Read = GUICtrlRead($h_List)
    If $s_Read = '' Then
    ContinueLoop
    Else
    For $i = 0 To UBound($a_Array) - 1
    If $s_Read = $a_Array[$i] Then
    If $i > 0 Then
    MsgBox(64, '-', $a_Array[$i - 1])
    Else
    MsgBox(16, '=', $a_Array[$i])
    EndIf
    EndIf
    Next
    EndIf
    EndSwitch
    WEnd

    [/autoit]

    Das ist mal ein überkompliziertes Beispiel dafür... Einfacher konnte ich es irgendwie nicht darstellen.

    Im Grunde brauchst du ja nur eine Zählvariable, die dem derzeit aktiven Element entspricht.
    Wird [+] gedrückt, returnst du $a_Array[$i + 1] und bei [-] eben $a_Array[$i - 1].

    Die wichtigen Parts im Beispiel zwischen den Zeilen 30-36 und 45-51.

  • Siehe mal hier $i+1, $i*30 . 8)

    [autoit]


    #include <GUIConstantsEx.au3>

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

    Dim $btn[3]
    #region - GUI Create
    GUICreate("Array + 1")
    For $i = 0 To 2
    $btn[$i] = GUICtrlCreateButton($i + 1, 20, 20 + $i * 30, 75, 22)
    Next
    #endregion - GUI Create

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

    GUISetState(@SW_SHOW)

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

    While True
    $nMsg = GUIGetMsg()
    Switch $nMsg
    Case $GUI_EVENT_CLOSE
    ExitLoop
    EndSwitch
    WEnd
    ; Ende

    [/autoit]
    • Offizieller Beitrag

    Du solltest bei Arbeiten im Array, gerade wenn du auf Folge- oder VorherIndex zugreifst, immer prüfen ob dieser Index überhaupt existiert. Ansonsten schmiert bei falschem Wert dort dein Skript mit Array-Fehler ab.

    Spoiler anzeigen
    [autoit]

    #include <EditConstants.au3>
    Global $array[10] = [10,20,30,40,50,60,70,80,90,100]

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

    $GUI = GUICreate('Test', 400, 100)
    GUICtrlCreateLabel('Index Start', 10, 23, 70, 17)
    $inStart = GUICtrlCreateInput('', 85, 20, 30, 20, $ES_NUMBER)
    $btAdd = GUICtrlCreateButton('+', 135, 20, 20, 20)
    $btSub = GUICtrlCreateButton('-', 170, 20, 20, 20)
    GUICtrlCreateLabel('Wert an neuem Index', 215, 23, 110, 17)
    $inCalc = GUICtrlCreateInput('', 340, 20, 30, 20, $ES_READONLY)
    GUICtrlSetBkColor(-1, 0xFFFFFF)

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

    GUISetState()

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

    While 1
    Switch GUIGetMsg()
    Case -3
    Exit
    Case $btAdd
    _SetIndexValue('+')
    Case $btSub
    _SetIndexValue('-')
    EndSwitch
    WEnd

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

    Func _SetIndexValue($sOp)
    Local $indexStart = GUICtrlRead($inStart), $index
    If $indexStart < 0 Or $indexStart >= UBound($array) Then $index = -1
    Switch $sOp
    Case '+'
    If $indexStart +1 < UBound($array) Then
    $index = $indexStart +1
    Else
    $index = -2
    EndIf
    Case '-'
    If $indexStart -1 >= 0 Then
    $index = $indexStart -1
    Else
    $index = -2
    EndIf
    EndSwitch
    If $index = -1 Then
    GUICtrlSetData($inStart, '!')
    ElseIf $index = -2 Then
    GUICtrlSetData($inCalc, '!')
    Else
    GUICtrlSetData($inCalc, $array[$index])
    EndIf
    EndFunc

    [/autoit]