Scripting.Dictionary Key Begrenzung?

  • Ich schreibe momentan an einem Programm.
    Dabei nutze ich ein Scripting.Dictionary. Mein Problem ist, dass ich als Key den Handle von Controls nehmen möchte und als Value ein Struct.
    Die Hashtable hab ich schnell verworfen, da aus dem Stuct dann ein String wird.
    Das Dictionary kann aber mit dem Struct ohne Probleme umgehen. Dafür ist dort das Problem, dass die Controls in meinem Programm Handles haben, die (meine Vermutung) zu groß für einen Key sind.
    Vielleicht kann mich dort einer von euch erleuchten, was AutoIt mit den Datentypen dort anstellt.

    Bei diesem Beispielscript tritt der Fehler bei mir nicht auf, auch wenn alle Daten gleich sind. Einziger unterschied: In dem Bespielscript sind die Handle deutlich kleiner.

    Da Handle nicht als Key genommen werden können hab ich probiert daraus Int, Strings,... zu machen. Selbes Ergebnis. Im Beispielscript klappts, im anderen stürzt ab:

    Ich find keine Bessere Erklärung, als dass die Variable größer ist...

    (Das Dictionary möchte ich nutzen, da später über das Handle auf das Struct zugegriffen werden soll und sich der Inhalt des Dictionarys oft ändern kann.)

    Ich hoffe ihr könnt mir helfen, Kanashius :)

  • Ich nehme an, es liegt daran, weil das Handle ('0x...') als Key wegen der führenden Null als Integer interpretiert wird... und das 'x' dann in diesem Fall den Fehler generiert.

    Dictionary Object

    Remarks
    A Dictionary object is the equivalent of a PERL associative array. Items can be any form of data, and are stored in the array. Each item is associated with a unique key. The key is used to retrieve an individual item and is usually an integer or a string, but can be anything except an array.

    Frei übersetzt: Der Schlüssel wird verwendet, um ein einzelnes Element abzurufen und ist in der Regel eine Ganzzahl oder ein String, kann aber alles außer einem Array sein.

    So funktioniert es...

    Spoiler anzeigen

    8 Mal editiert, zuletzt von Bitnugger (2. Januar 2017 um 05:52)

  • Das ist für mich leider nicht die Lösung, aber Danke für deine Hilfe, dadurch hab ich nochmal getestet und den Fehler gefunden...
    Das Script von mir oben funktioniert ja.
    Nur wenn ich das mit dem eigentlichen Script mache klappt es nicht.
    Die 0x... ist ja nur die Hexadezimale Darstellung zum Lesen. In wirklichkeit versteckt sich dahinter ja ein Handle, also ein Pointer.
    Bei einem 32Bit System also ein 32Bit Pointer. Wenn ich daraus einen Int mache ergab sich das Problem, dass das einfügen scheitert...

    Ich hab in der Funktion vorher noch eine andere Zeile gehabt:
    if $__DG_Controls(Int($iControl))<>"" then SetError(2,0,-1)
    Wenn in diesem If der richtige Datentyp genutzt wurde, wurde ein Fehler geworfen. Allerdings in der Zeile des hinzufügens.
    Nutzte ich beim hinzufügen einen String und hier einen Int-cast gab es keinen Fehler, aber es funktionierte natürlich nicht.
    Nachdem ich daraus ein if $__DG_Controls.Exists(String($iControl)) then SetError(2,0,-1)
    gemacht hatte funktionierte es.

    Wobei ich mir nicht erklären kann, warum die eine Zeile mit dem richtigen Datentyp einen Fehler wirft, mit der Zeilenangabe 10 Zeilen tiefer beim hinzufügen.

    Naja. Problem gelöst :)

  • Wobei ich mir nicht erklären kann, warum die eine Zeile mit dem richtigen Datentyp einen Fehler wirft

    Schaue dir die Ausgabe von diesem Script an... für mich ist es offensichtlich, dass es an dem "0x" liegt.

    Spoiler anzeigen


    Ausgabe:

  • Ne, der Fehler den du da hast entsteht, weil ein Pointer nicht als Key genutzt werden kann.
    Siehe folgends Script:

    Die Umwandlung ist kein Problem. Es lag wirklich an dem Aufruf vorher.