DllStructGetData durch Punkt-Notation ersetzen ein Risiko?

  • Hallo Leute,
    ich habe mir heute das Dll-Tutorial von @BugFix angeschaut. Da schreibt er u.a. (es ist wohl schon etwas her):


    Mit Einführung der Version 3.3.10.0 gab es Syntaxänderungen. Dadurch ist ein geänderter Zugriff auf Strukturelemente möglich. Die Bsp. sind dahingehend angepasst.
    Die Verwendung der Punktnotation(Strukturname.Feld) ist zwar syntaktisch möglich, ganz offiziell aber kein sicherer Zugriffsstandard. Sollte es also damit mal nicht klappen, ist auf die Standardsyntax zurückzugreifen.

    Ist das noch aktuell? Im engl. Forum habe ich dazu nur eine Diskussion von 2014 entdeckt und dann nochmal diese Aussage von trancexx.
    Mir gefällt die kurze Schreibweise und ich habe das mit einem Beispiel zu einem Listview-Klick getestet. Ich wollte mal schauen, ob es Nachteile dabei gibt und habe einen Fehler provoziert.

    Spoiler anzeigen

    In der besagten Diskussion behauptete einer, die Kurzschreibweise sei nicht nur kürzer, sondern in der Ausführung viel schneller. Im Code frage ich aber nicht nur nach Index sondern gleich darauf nach Nonsens, was natürlich Quatsch ist und eine Fehlermeldung bringt. Überrascht hat mich, dass auch bei der Punkt-Notation @error den Wert 2 bekommen hat (in der Funktion DllStructGetData bedeutet error 2 = Element out of range or unknown. - was ja passt).
    Sieht so aus, als wird im Hintergrund weiter DllStructGetData ausgeführt, oder?

    Kann man das nun sicher benutzen, oder sollte man das meiden? Hat jemand aktuellere Informationen?

    Grüße autoiter

  • Der Geschwindigkeitsvorteil wird wohl teilweise davon kommen, dass der AutoIt Interpreter mehr zu verarbeiten hat.
    $test = $tInfo.Nonsens ist bedeutend kürzer als $test = DllStructGetData($tInfo, "Nonsens").

    Bei Letzterem muss er erstmal die Zeile parsen (beim 1. auch) dann die Funktion identifizieren und ebenfalls den String "Nonsens" parsen.
    Bei der Punktnotation hast du nur Objekt und Attribut.

    Hast du denn bisher Probleme mit der Punktnotation überhaupt gehabt? Wenn nicht kannst du sie ja verwenden, da gibt es in AutoIt wesentlich gefährlichere Sachen.

  • Danke dir für die Info.

    Hast du denn bisher Probleme mit der Punktnotation überhaupt gehabt? Wenn nicht kannst du sie ja verwenden, da gibt es in AutoIt wesentlich gefährlichere Sachen.

    Nein, bisher habe ich keine Probleme festgestellt. Allerdings habe ich noch nicht viel damit gemacht und wollte das gleich klären, bevor ich mich völlig verrenne :D

    Grüße autoiter

  • Ich hab bisher noch keine Probleme damit gehabt und ich hab AutoIt schon für viele Sachen missbraucht wofür es nie ausgelegt war. Mach dir da mal kein Kopf drum :)

    • Offizieller Beitrag

    Habe schon seit der Existenz dieser Schreibweise mein Code nur noch so geschrieben und viele sehr große, komplexe Scripte gepostet. Anfaenglich habe ich, falls irgendwas nicht geklappt hat, die Schuld gerne auch auf die Punktnotation geschoben, um dann aber festzustellen, dass mit DllStructSetData genau das gleiche passiert ist und das Problem mal wieder 20cm vor dem Bildschirm zu suchen war.

    Kurz und knapp: Es ist sicher, sonst waere mir garantiert was aufgefallen. Das einzige worauf du aufpassen musst: Wenn du Arrays in den Strukturen hast (z.B. char[5]) ist erstens aus irgendeinem unerfindlichem Grund der erste Index nicht wie sonst überall auch 0, sondern 1 (wie bei DllStructSetData auch), und wenn du den Index aus einer Variable ausließt musst du zwei Klammern darum setzten (ist wohl ein Bug)

    Spoiler anzeigen

    Lieben Gruß,
    Spider

    • Offizieller Beitrag

    und wenn du den Index aus einer Variable ausließt musst du zwei Klammern darum setzten (ist wohl ein Bug)

    Ich halte das nicht für einen Bug.
    Das ist vergleichbar mit jeder anderen Funktion aus AutoIt, die ein Array als Ergebnis liefert. Möchte man dort in einem Atemzug auf einen Wert zugreifen muß man vor dem Zugriff den Aufruf auch extra einklammern und dann den Indexaufruf anhängen: Wert = (Func_liefert_Array)[Index].
    Das ist zwar syntaktisch nicht identisch, ich könnte mir aber vorstellen, dass dieselbe Logik dahinter steckt.

  • [...] Möchte man dort in einem Atemzug auf einen Wert zugreifen muß man vor dem Zugriff den Aufruf auch extra einklammern und dann den Indexaufruf anhängen: Wert = (Func_liefert_Array)[Index]. [...]

    Das ist wohl nicht so ganz korrekt:

    AutoIt
    ConsoleWrite(GetArray()[0] & @CRLF)
    ConsoleWrite(GetArray()[1] & @CRLF)
    ConsoleWrite(GetArray()[2] & @CRLF)
    
    
    Func GetArray()
    	Local $aRet = [1, 2, 3]
    	Return $aRet
    EndFunc

    Klappt auch ohne die Klammern drum herum wunderbar. Ich gehe eher davon aus dass die intern die Punkt Notation einfach in ein DllStructGetData() umwandeln und dass beim parsen die Variablen da einfach ein wenig Probleme machen. Entweder beheben die das irgendwann oder es bleibt bestehen. ^^

  • BugFix hat schon Recht. Er meinte aber wohl eher Ausdrücke die selbst indizierbar sind.
    Diese sind anders nicht in einem Ausdruck auswertbar. Also z.B. ein Array in Array:

    AutoIt
    Global $A[3]
    Global $B[] = [1,2,3]
    $A[1] = $B
    ConsoleWrite(($A[1])[1] & @CRLF)

    Bei den DLLStruct-Arrays sieht das bisschen anders aus, da dort keine indizierbare Struktur zurück kommt sondern lediglich der Zeiger auf den Anfang der internen Liste.
    Daher braucht man hierfür eine andere Syntax für den Direktzugriff weswegen man dann anscheinend diese Doppelklammern eingeführt hat (wenn auch anscheinend undokumentiert):

    AutoIt
    $t_Test = DllStructCreate("Int Test[20]")
    
    
    DllStructSetData($t_Test, 1, 100, 1)
    ConsoleWrite( ($t_Test.Test) & @CRLF)
    
    
    DllStructSetData($t_Test, 1, 5, 10)
    ConsoleWrite( $t_Test.Test((10)) & @CRLF)

    Das Verhalten ist ziemlich sicher kein Bug - ein Parser der diese Eigenschaft aus Versehen erzeugt ist nicht wirklich wahrscheinlich.

  • Hmn, dann hab ich ihn Missverstanden. Durch das Func_liefert_Array ( Wert = (Func_liefert_Array)[Index] ) ging ich davon aus dass es sich dabei um ein Array handelt welches von einer Funktion zurück gegeben wird. Den Array im Array Fall hatte ich dabei nicht im Sinn gehabt und ehrlich gesagt, hab ich diese Syntax Spielerei auch noch nicht gesehen bzw. war mir bekannt.