Kleines Array Problem

  • Hei Leute,
    ich bastel jetzt seit einem Tag mit AutoIt (Normal programmiere ich nur in Websprachen, aber ich dachte ich probier AutoIt mal aus) und habe ein kleines Array Problem.
    Ich möchte, dass der Nutzer jedes mal ein Input Fenster sieht, bei dem er eine neue ID eingeben kann. Also:

    [autoit]


    Dim $fieldarray[1]
    $fieldid=InputBox("ID","Bitte gebe die erste ID ein")
    While $fieldid <> ""
    _ArrayAdd($fieldarray,$fieldid)
    _ArrayDisplay($fieldarray,"Ganzer Array") ; Zum debuggen
    $fieldid=InputBox("ID","Bitte gebe die nächste ID ein")
    WEnd

    [/autoit]


    Ich tue das Ganze, in eine Schleife, weil ich mich nicht bei der Anzahl der ID's festlegen will. Abe soweit ich das verstanden habe kann man nur Arrays mit Zeilenangabe definiere, deswegen verwende ich in der Schleife Push (Sry Add ^^), aber mein Problem ist, das $fieldarray[0] dann immer leer bleibt, also bräuchte ich entweder eine unkomplizierte Möglichkeit bei der 0 einen Wert reinzubekommen oder einen Vorschlag wie sich so eine Liste öffnet, wie bei ArrayDisplay, in der der User die Werte frei eintragen kann.

    2. Frage, kann man Werte in AutoIt einfach incrementen, wie z.B. in PHP ? Da gehts ja mit

    PHP
    $variable = 1;
    $variable++:

    mfg :)

  • Hi,
    Hier gibt es ein Array Tutorial, was auf AutoIt zugeschnitten ist.
    Du solltest dich schon auf eine feste größe der Array festlegen, man kann die Array zwar vergrößern und verkleinern mit ReDim, aber das ist Geschwindigkeit- und Speichertechnisch ein Dilemma...

    Um eine Variable zu erhöhen kannst du $Var += 1 schreiben

  • Hi, warum ist es so schlimm, dass das 1. Feld leer bleibt?
    Wenn du das nicht magst, zeige ich dir mal eine effizientere Möglichkeit, die nicht bei jedem hinzufügen das Array vergrößern muss:

    [autoit]

    Global $i = 0, $a[1]
    $input=InputBox("ID","Bitte gebe die erste ID ein")
    While $input
    If $i >= Ubound($a) Then ReDim $a[Ubound($a)*2] ; Wenn das Array voll ist, Größe verdoppeln
    $a[$i] = $input
    $i += 1 ; Variable hochzählen
    $input=InputBox("ID","Bitte gebe die erste ID ein")
    Wend
    If $i Then ReDim $a[$i] ; Am Ende Größe an Inhalt anpassen.
    _ArrayDisplay($a)

    [/autoit]
  • Danke erstmal an euch beide :) Das Tutorial war sehr aufschlussreich, Ubound und ReDim hab ich nocht nicht gekannt. @progandy, Ich bin in der Richtung ein bisschen perfektionistisch ^^ Danke für den Code, auf ein rezisen am Ende bin ich jetzt nicht gekommen X(

  • Auch wenn Progandy's Variante vielleicht im Endeffekt etwas performanter sein mag spielt die Performance hier doch aber keine Rolle, weil die Schleife permanent durch Usereingaben unterbrochen wird und wir es hier wohl nur mit sehr kleinen Arrays mit vermutlich weniger als 100 Einträgen zutun haben. Diese Methode macht höchtens Sinn wenn wir Richtung 1000+ Einträge gehen und das Befüllen automatisch ohne Unterbrechung erfolgt. Für das Beispiel hier ist die arrayadd Funktion denke ich die benutzerfreundlichste.

    Hier noch eine Ergänzung um das Array nachträglich 0-basiert zu bekommen:

    [autoit]


    Dim $fieldarray[1]
    $fieldid=InputBox("ID","Bitte gebe die erste ID ein")
    While $fieldid <> ""
    _ArrayAdd($fieldarray,$fieldid)
    _ArrayDisplay($fieldarray,"Ganzer Array") ; Zum debuggen
    $fieldid=InputBox("ID","Bitte gebe die nächste ID ein")
    WEnd
    _arraydelete($fieldarray,0) ; löscht index 0 und verkleinert das Array um 1
    _ArrayDisplay($fieldarray,"Ganzer Array") ; Zum debuggen

    [/autoit]

    Grundsätzlich stört es aber auch nicht wenn wir ein 1-basiertes Array verwenden, du musst das eben später beim auslesen berücksichtigen:

    [autoit]


    for $i=1 to ubound($array)-1 ; statt $i =1 eben $i = 0 wenn deine Daten 0-basiert sind
    msgbox(0,"Index Nummer: " & $i,$array[$i])
    next

    [/autoit]

    Anstelle einer msgbox könntest du so natürlich auch edit Felder deiner gui befüllen oder dir ein lisview in einer gui füllen (array display ersatz oder sowas...).
    Da du aber noch nix mit Autoit zutun hattest wird das aber wohl erstmal etwas zuviel des Guten sein.

  • Mit einer eigenen Funktion bekommt man auch 0-basierte Arrays ohne löschen hin:

    [autoit]

    Global $array
    _ArrayAddCreate($array, "test")
    Func _ArrayAddCreate(ByRef $aArray, $vValue)
    ; ProgAndy
    If Not IsArray($aArray) Then
    Dim $aArray[1] = [$vValue]
    Return True
    ElseIf UBound($aArray, 0) <> 1 Then
    Return SetError(1, 0, False)
    EndIf
    Local $iB = UBound($aArray)
    ReDim $aArray[$iB+1]
    $aArray[$iB] = $vValue
    Return True
    EndFunc

    [/autoit]