Map - Welche Datentypen als Key

  • Ich habe mir mal ein kleines Bsp.-Skript für Maps erstellt. Im letzten Schritt wollte ich testen, welche Datentypen sich als Schlüssel verwenden lassen.

    Lasst es einfach mal durchlaufen und im zweiten Schritt aktiviert die MapExist-Prüfung in der Funktion _KeyAssignCheck (Kommentare freigeben).

    Ohne Prüfung wird alles als erfolgreich angegeben, mit Prüfung werden einige Datentypen aber als existierende Schlüssel betrachtet, ich hätte eigentlich erwartet, dass Objekte oder Strukturen beim Hinzufügen als Key einen Fehler auswerfen.

    Dass Bool und Keyword mit den AutoItersetzungen (Bool=0/1; Keyword=0) interpretiert werden und somit als Integer-Key Verwendung finden war erwartbar. Aber was für Werte sind dann Strukturen, Arrays oder Objekte? Eine Art UNKNOWN_KEY, der dann für alle gleichermaßen Verwendung findet?

    Ist sicher etwas abstrakt - aber es interessiert mich halt, was machbar ist. ;)

  • Ich bin nicht sicher, ob ich die Aufgabenstellung verstanden habe. Hier ist meine Interpretation dazu: AutoIt bildet "alles" einfach auf Int64 ab, außer es ist ein String.


    Also nach dem Motto:

    Code
    Func Int64S($x)
        Return IsString($x) ? $x : Int($x, 2)
    EndFunc
    
    ;$Map[$something] ist äquivalent zu $Map[Int64S($something)]

    lg
    M

  • Moin!

    Zitat

    A Map is a variable containing a series of data elements, each consisting of a key/value pairing. An element can only be accessed by a key, which can be either a string or an integer

    Floats werden offenbar auf den Integerteil zusammengekürzt, die anderen Datentypen werden als Key 0 abgebildet.

    AutoIt
    ; DEKLARATION
    ; wie ein Array nur ohne Elementzahl und ohne Wertzuweisung
    Global $gmMap[]
    $gmMap[123.456] = 'float'
    $gmMap[DllStructCreate('byte[4]')] = '$t'
    For $key In MapKeys($gmMap)
        MsgBox(0, "", StringFormat('KEY: %-10s, VALUE: %s', $key, $gmMap[$key]) & @CRLF)
    Next
    Exit
  • Floats werden offenbar auf den Integerteil zusammengekürzt, die anderen Datentypen werden als Key 0 abgebildet.

    Ja. Ich hätte eigentlich nur von Anfang an das Skript so ausführen müssen:

    Ausgabe

    Resultat: Es gibt genau 2 Datentypen als Key - String und Int64.

  • Ich hänge es mal hier mit dran, auch wenn es nicht die direkte Fragestellung betrifft:

    Maps lassen sich auch prima verschachteln

    Ausgabe

    Code
    KEY ["eins"]: Val-1
    KEY ["zwei"]: Type-Map
    KEY ["zwei"]["insideMap-1"]: Val-In-1
    KEY ["zwei"]["insideMap-2"]: Val-In-2
    KEY ["zwei"]["insideMap-3"]: Type-Map
    KEY ["zwei"]["insideMap-3"]["insideMap-3-1"]: Val-In-3-1
    KEY ["zwei"]["insideMap-3"]["insideMap-3-2"]: Val-In-3-2
  • Hab gerade herausfinden müssen: Wenn man negative Doubles als Key verwenden will (z.B. $map[-1.234] = 5) schmiert AutoIt nach ab :D

    Wenn man einen negativen Integer nutzt gibts die übliche "Variable subscript badly formatted" Meldung, bei negativem Double rechnet er erst eine halbe Sekunde und crasht dann.

  • Hab gerade herausfinden müssen: Wenn man negative Doubles als Key verwenden will (z.B. $map[-1.234] = 5) schmiert AutoIt nach ab :D

    Wenn man einen negativen Integer nutzt gibts die übliche "Variable subscript badly formatted" Meldung, bei negativem Double rechnet er erst eine halbe Sekunde und crasht dann.

    Da hatte ich gar nicht dran gedacht (negative Key). Also Änderung:

    Resultat: Es gibt genau 2 Datentypen als Key - String und positive Int64.

    Letztlich bestimme ich ja beim Erstellen des Skriptes, wie der Key eingesetzt wird. Bleibt die Überlegung, ob es erforderlich ist eine Key-Prüfung vorzuschalten. Aber kann eigentlich die Situation eintreten, dass ich keinen Einfluss auf den Key habe? Wohl nicht, und sollte der Key aus irgendeiner Userinteraktion entstehen, bleibt mir programmiertechnisch ja in diesem speziellen Fall sowieso die Pflicht zur Fehlerprüfung.

    Also ist alles gut, wie es ist.

    Ich weiß, welche Keys erlaubt sind und wenn ich das ignoriere, fliegt's mir halt um die Ohren. :rofl: Wer wider besseren Wissens seine Suppe mit der Gabel essen will, braucht sich ja auch nicht wundern, dass er nicht satt wird. 8o