Assoziatives oder zweidimensionales Array

  • Hallo allerseits,

    jetzt habe ich zwar meine Probleme mit der ollen Paradox-DB in den Griff gekriegt, aber dafür stellen mir die "guten, alten" Arrays wieder mal Beinchen.

    Also, folgendes Problem:
    In meiner Datenbank gibt es unter anderem die Tabellen "Datei" und "Status".
    Beide enthalten die Felder "ID" und "Beschreibung", die ich jeweils aus der DB auslese.
    In der GUI sollen nur die Beschreibungen in Comboboxen eingetragen werden.

    Für weitere Auswertungen sollen allerdings immer die zugehörigen IDs eines selektierten Eintrags aus den Beschreibungslisten genutzt werden.

    Im Grunde eine Aufgabe, die nach dem Einsatz assoziativer Arrays "schreit".
    Dazu hab' ich mir dann direkt die UDF von BugFix besorgt und ausprobiert.
    Aber irgendwie will mir die Umsetzung nicht gelingen.

    Folgenden Lösungsansatz hatte ich angedacht:

    [autoit]

    #include <AssocArray.au3>

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

    $g_ar_State = _AssocArray_Create()

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

    _AssocArray_Insert($g_ar_State, 1, "Eins")
    _AssocArray_Insert($g_ar_State, 2, "Zwei")
    _AssocArray_Insert($g_ar_State, 3, "Drei")
    _AssocArray_Insert($g_ar_State, 4, "Vier")

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

    ConsoleWrite (_AssocArray_ToString($g_ar_State) & @CRLF)

    [/autoit]


    Als Ergebnis von kriege ich allerdings nur "1" angezeigt.

    Kann mir da jemand auf die Sprünge helfen?

    Gruß
    Benne

    Einmal editiert, zuletzt von benne (18. Mai 2011 um 16:03)

  • Soweit ich die UDF verstanden habe implementiert sie missverständlich eben kein assoziatives Array (Schlüssel-Wert-Struktur) sondern eine ArrayList.
    Was aber auch falsch wäre da bei einer ArrayList die Elemente verteilt im Speicher liegen und durch Pointer zu einer Einheit verknüpft werden.
    Daher denke ich wirst du mit der UDF für dein Vorhaben nicht weit kommen.
    Das komfortabelste soetwas in AutoIt abzubilden ist das Dictionary-Objekt. Allerdings mit dem Unterschied zu einem assoziativen Array dass Schlüssel nur einmal vorkommen können.

    Mal ein Beispiel zur Verwendung:

    Beispiel zur Verwendung des Dictionary-Objektes
    [autoit]

    ;//// Dictionary Erstellen ///////////
    $oDict = ObjCreate("Scripting.Dictionary")

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

    ;//// Einträge hinzufügen ///////////
    $oDict.add ("Berlin", 3395189)
    $oDict.add ("Hamburg", 1743627)
    $oDict.add ("München", 1259677)
    $oDict.add ("Köln", 983347)
    $oDict.add ("Dresden", 517052)
    ;Beispiel hier: Einwohnerzahl wird der jeweiligen Stadt zugeordnet.

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

    ;//// Anzahl der Elemente bestimmen ///////////
    MsgBox(0,"Anzahl Elemente in Dictionary", $oDict.Count)

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

    ;//// Überprüft ob ein Element vorhanden ist ///////////
    If $oDict.Exists ("Bonn") Then MsgBox(0, "", "Bonn ist eingetragen") ;Bonn ist im Bsp. nicht enthalten

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

    ;//// Löscht ein Element aus dem Dictionary ///////////
    $oDict.remove ("München")

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

    ;//// Elemente aufrufen ///////////
    ConsoleWrite("Einwohner(Berlin): " & $oDict("Berlin") & @CRLF)
    ConsoleWrite("Einwohner(Dresden): " & $oDict("Dresden") & @CRLF & @CRLF)

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

    ;//// alle Schlüssel durchgehen ///////////
    For $sKey in $oDict.Keys
    ConsoleWrite("Einwohner(" & $sKey & "): " & $oDict($sKey) & @CRLF)
    Next
    ;/// Alle Werte statt Schlüssel erreicht man mit $oDict.Items ////

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

    ;//// Leert das Dictionary ///////////
    $oDict.RemoveAll

    [/autoit]
  • Hm, das scheinen mir beides gangbare Wege zu sein.
    Danke schonmal für die Hinweise darauf.

    Habt ihr zufällig Erfahrungswerte, was die Ausführungsgeschwindigkeit angeht?
    Mein Programm soll zwar nicht auf Teufel-komm-raus schnell sein, aber es sollte das alte Tool schon übertreffen ;)

    Gruß
    Benne