Struct via "Struct.Element" ansprechen - Beta 3.3.9.5

  • Beim Experimentieren mit AutoIt Beta 3.3.9.5 hab ich zufällig bemerkt, dass man die einzelnen Elemente einer Struct folgendermaßen ansprechen kann:

    [autoit]

    $tStruct = DllStructCreate("int X;")
    $tStruct.X = 12

    [/autoit]

    Auch der Zugriff auch den SubIndex ist möglich, allerdings nur hardcoded, wie folgendes Beispiel zeigt:

    [autoit]


    $tStruct = DllStructCreate("int X; int Y; int Z; int A[4];")
    $tStruct.X = 12
    $tStruct.Y = 34

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

    $tStruct.X += 1
    $tStruct.Z = $tStruct.X + $tStruct.Y

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

    ConsoleWrite("+ " & $tStruct.X & " + " & $tStruct.Y & " = " & $tStruct.Z & @CRLF)

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

    For $i = 1 To 4
    $tStruct.A($i) = $i ;not working
    ConsoleWrite("! " & DllStructGetData($tStruct, "A", $i) & @CRLF)
    Next

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

    $tStruct.A(1) = 11
    $tStruct.A(2) = 22
    $tStruct.A(3) = 33
    $tStruct.A(4) = 44

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

    For $i = 1 To 4
    ConsoleWrite("+ " & DllStructGetData($tStruct, "A", $i) & @CRLF)
    Next

    [/autoit]

    Das wäre für mich eine der wichtigsten und besten Neuerungen gewesen, die eine neue AutoIt Version mit sich gebracht hätte, aber...
    nun bin ich auf das hier gestossen: http://www.autoitscript.com/trac/autoit/ticket/2220

    Bedeuted das nun, dass ich meine Freude gleich wieder dämpfen kann und dieses Feature etwa doch nicht umgesetzt wird?!

    Weiß jemand mehr?

    E

  • Das ist aber schon ewig möglich. Ich nutze es in meinem neuen Projekt und habe eine sehr alte Au3-Version, die ich vlt. mal update, wenn ich mich mal mit dem neuen Syntax vertraut gemacht hab.

  • Der Trac Eintrag ist vom 13.6., die 3.3.9.5 Beta vom 23.4.
    Die Tatsache, dass es noch nicht rausgeflogen ist, sagt Dir also ...


  • Das ist aber schon ewig möglich. Ich nutze es in meinem neuen Projekt und habe eine sehr alte Au3-Version, die ich vlt. mal update, wenn ich mich mal mit dem neuen Syntax vertraut gemacht hab.

    Bei meiner 3.3.8.1 Stable funktioniert das nicht.
    Bei der 3.3.9.5 hingegen schon.
    Es scheint also nich nicht "ewig" möglich zu sein.

    Edit:
    Der Zugriff (zum Lesen) funktioniert auch nur ohne Schleifen.

    Spoiler anzeigen
    [autoit]

    $tStruct = DllStructCreate("int X; int Y; int Z; int A[4];")
    $tStruct.X = 12
    $tStruct.Y = 34

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

    $tStruct.X += 1
    $tStruct.Z = $tStruct.X + $tStruct.Y

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

    ConsoleWrite("+ " & $tStruct.X & " + " & $tStruct.Y & " = " & $tStruct.Z & @CRLF)

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

    For $i = 1 To 4
    $tStruct.A($i) = $i ;not working
    ConsoleWrite("! " & DllStructGetData($tStruct, "A", $i) & @CRLF)
    Next

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

    $tStruct.A(1) = 11
    $tStruct.A(2) = 22
    $tStruct.A(3) = 33
    $tStruct.A(4) = 44

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

    For $i = 1 To 4
    ConsoleWrite("+ " & DllStructGetData($tStruct, "A", $i) & @CRLF)
    Next

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

    For $i = 1 To 4
    ConsoleWrite("! " & $tStruct.A($i) & @CRLF)
    Next

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

    ConsoleWrite("+ " & $tStruct.A(1) & @CRLF)
    ConsoleWrite("+ " & $tStruct.A(2) & @CRLF)
    ConsoleWrite("+ " & $tStruct.A(3) & @CRLF)
    ConsoleWrite("+ " & $tStruct.A(4) & @CRLF)

    [/autoit]

    Edit2:
    Gibt es vllt die Möglichkeit an die "neuste Version" der 3.3.9.5 zu kommen ? (intern wird es bestimmt eine weitere Versionsnummer geben).

  • Uf. Asche auf mein Haupt, ich hab die Struct mit AutoItObject erstellt. :rolleyes:. Dann funktioniert das auch mit der 3.3.6.1 :D .

    Was ich aber mal fragen wollte. Zukünftig soll ja das möglich sein:

    $Console = consolewrite()
    $Console("Text")

    aber ist es dann trotzdem noch möglich die Objekte richtig zu benutzen, wie z.B.

    $oFactory.DrawRect(0,0,100,100,$DRect()) ?
    Dann müsste doch $DRect als Funktion erknnt werden. egal was vorher steht?

  • Meinst du sowas ?

    [autoit]

    #AutoIt3Wrapper_Run_AU3Check =N
    Global $Console = ConsoleWrite

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

    _Main(5 & @CRLF, $Console)

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

    Func _Main($iZahl, $Func)
    $Func($iZahl)
    EndFunc

    [/autoit]

    Wenn eine Funktion als Parameter funktioniert wird sie vermutlich auch als Parameter für Objekte funktionieren.
    Bin mir aber nicht ganz sicher, da ich keine Objekte (im eigentlichen Sinne) in AutoIt nutze.

  • Zitat

    $oFactory.DrawRect(0,0,100,100,$DRect())


    Übersehe ich hier gerade etwas? :huh: Eigentlich kann der Interpreter das doch nur als Funktion betrachten.
    Edit: Ach so ist das gemeint... Hierbei wird der Inhalt der Variable berücksichtigt. Sollte er zumindest. Die Variable verhält sich bei Zuweisung einer Funktion wie eine Art Pointer so wie ich das verstanden habe.

  • Also berücksichtigt dann Au3 den Inhalt / den Typ.

    Für $Drect wird zuerst eine Struct mit AO erstellt, die dann mit z.B. $DRect.Top = 10 gefüttert wird. Soweit dürfte es ja keinen Error geben.
    Allerdings ist $DRect() dann immernoch eine "Variable", die auh als Solche an die DrawRect-Methode übergeben wird.

    Dann dürfte es doch Komplikationen geben mit z.B. $Var() und einen undef. Function Error. Naja hoffe mal das der Inhalt/Typ geprüft wird ;)

  • Hey das ist ja mal wieder sehr nützlich und schön zu sehen das die Entwicklung von AutoIt wirklich sehr schöne große Schritte vorwärts macht.
    Ich persönlich bin ja schon seit Beta 3.3.9.3 begeistert dass es nun möglich ist Expressions direkt als Arrays oder Objekte anzusprechen was doch so manche temporäre Variable überflüssig macht.
    2 Beispiele (gleich aus der Changelog):

    [autoit]

    StringSplit("a,b", ",")[1]

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

    ObjCreate("Shell.Application").GetSystemInformation("DirectoryServiceAvailable")

    [/autoit]


    Aber da ich nun auf die Beta 3.3.9.5 aufmerksam geworden bin hab ich noch entdeckt das endlich der ternäre Operator eingeführt wurde.
    Wer schon bisschen was in C geschrieben hat der wird diesen Operator sehr liebengelernt haben da er den Code so schön kurz und absolut unleserlich machen kann ;):

    [autoit]

    $bResult = ("foo" = "bar") ? False : True

    [/autoit]

    Leider kann ich natürlich auch keine Auskunft geben ob es das Struct-Feature in die stabile Version schafft - zu hoffen wäre es.

  • Ein ? im Code, [] nach Funktionen, Funktionen in Variablen.
    Bald ist AutoIt Code sicher.
    Wenn man damit obfuscatet wird es wirklich hart etwas zu entziffern^^

    Und noch eine Frage: Woher kommt dieses "foo"
    Ich lese das immer wieder überall bei irgendwelchen Programmen.
    Kann darin aber keinen näheren Sinn erkennen. (Funktionsname/Varname/usw)


  • Aber da ich nun auf die Beta 3.3.9.5 aufmerksam geworden bin hab ich noch entdeckt das endlich der ternäre Operator eingeführt wurde.
    Wer schon bisschen was in C geschrieben hat der wird diesen Operator sehr liebengelernt haben da er den Code so schön kurz und absolut unleserlich machen kann ;):

    [autoit]

    $bResult = ("foo" = "bar") ? False : True

    [/autoit]

    Braucht man das wirklich? Das macht den Code nur komplizierter und ich habe es bisher noch nie verwendet. Und wenn man es unbedingt braucht, dann gibt doch schon die Funktion _Iif.


    Ich hätte sehr gerne für AutoIt-Code ein try-catch System. Das macht den Code deutlich übersichtlicher und einfacher.

  • Braucht man das wirklich? Das macht den Code nur komplizierter und ich habe es bisher noch nie verwendet.

    Es ist ein Sprachfeature welches man nutzen kann - oder eben nicht. "Brauchen" ist da das falsche Wort.
    Ob es den Code unnötig kompliziert macht kommt lediglich auf die Verwendung an.
    Für dieses Beispiel hier macht es den Code nicht wirklich unnötig komplizierter.
    Eine einzige Zeile die man schnell überblicken kann anstatt 5 Zeilen auf herkömliche Wege welche lediglich eine popelige Zuweisung mit Abfrage darstellt macht meiner Meinung nach den Code übersichtlicher statt dem Gegenteil.
    Und übersichtlicher als _Iif() ist diese Syntax allemal.

    Ich hätte sehr gerne für AutoIt-Code ein try-catch System.

    Das wäre dann der nächste Schritt. :)
    Aber da müsste ja erstmal ein Exception-System in AutoIt implementiert werden.

  • Marthog
    Also möchtest du das die Entwickler von AutoIt diesen Operator wieder rausnehmen?

    Das dieser Operator per se zu unübersichtlichen Code führt kann man wie gesagt nicht pauschal sagen.
    Meiner Meinung nach kann er die Lesbarkeit in vielen Fällen sogar erhöhen.
    Ich freue mich über diesen Operator und werde ihn auch gerne, wo er Sinn macht, verwenden.
    Es ist ja auch kein außergewöhnlich skurriles Sprachfeature welches eher eine Spielerei darstellt sondern in vielen anderen Sprachen (C, C++, C#, Java, JavaScript, Lua, Perl, PHP...) ebenfalls implementiert.