Werte zuweisung beim Array, Index wird doppelt ausgeführt

  • Hi,

    ich hatte heute ein ziemlich seltsamen Fehler, den ich recht lange suchen musste.

    Der "Ausdruck" für den Index bei einem Array (nur bei der Werte zuweisung) scheint doppelt ausgeführt zu werden.

    AutoIt
    #include<Array.au3>
    Global $aArray[10]
    Global $oStack = ObjCreate("System.Collections.Stack")
    $oStack.Push(0)
    $oStack.Push(1)
    $oStack.Push(2)
    $aArray[$oStack.Pop()] = "test"
    ;( .Pop gibt den zuletzt gespeicherten Wert aus, dieser wird dann gelöscht und es kann auf den nächsten wert zugegriffen werden. Siehe https://autoit.de/index.php?thread/3407-alternativen-zum-array/)
    _ArrayDisplay($aArray)

    Hier würde ich jetzt erwarten, dass Index 2 den String "Test" enthält.

    Dieser befindet sich aber in Index 1!

    Hier nochmal eine Varriante bei der die doppelte Ausführung etwas auffälliger ist:

    AutoIt
    #include<Array.au3>
    Global $aArray[10], $var
    $aArray[MsgBox(0,"Zuweisung", "Hi, ich erscheine zweimal.")] = Null
    
    $var = $aArray[MsgBox(0,"Abruf", "Ich hingegen nur einmal ;(")]

    Die Zweite Msgbox ist in keiner Zuweisung, sie wird nur einmal ausgeführt.

    Da die doppelte Ausführung normalerweise folgenlos bleibt,( z.b. bei einer Varriable oder einer Zahl) ist es nicht sichtbar.

    Relevant wird es nur wenn man Funktionen (z.B. Random in kombination mit SRandom oder .Pop usw.) direkt einsetzt.

    Natürlich ist das einfach zu umgehen, denoch finde ich das recht kurios.

    @AutoItVersion: 3.3.14.2

    @OSVersion: WIN_10

    [Edit]

    Ticket wurde abgelehnt, vor 3 Jahren ist wohl schon jemand über das Problem gestolpert und hatte ein Ticket erstellt.

    https://www.autoitscript.com/trac/autoit/ticket/3003

    mfg

    Zeitriss

    2 Mal editiert, zuletzt von Zeitriss (25. Oktober 2017 um 20:07) aus folgendem Grund: Problem war schon bekannt

  • Ich kann das Verhalten bestätigen.
    Kurz: Ich halte das ebenso für einen Bug.

    Auf die Schnelle konnte ich im Bug-Tracker keinen entsprechenden Eintrag finden.

    Wenn keiner hier eine plausible Erklärung hierfür liefert wäre ein entsprechender Bug-Report wohl anzudenken.

  • Ich kann das zweite Beispiel so gar nicht ausführen, sondern muss schreiben:$test = $aArray[MsgBox(0,"Abruf", "Ich hingegen nur einmal ;(")]

    Aber das Verhalten konnte ich auch nachvollziehen. Echt interessant.

    Grüße autoiter

    • Offizieller Beitrag

    Das Problem entsteht innerhalb der Arrayzuweisung. Wird die Funktion dort ausgeführt ist dieses Phänomen sichtbar.

    Fangen wir aber .Pop() in einer Variablen auf und adressieren das Array damit, stimmt es.

  • Zeitriss schrieb ja dass es leicht umgangen werden kann ohne dass es weiter auffällt.


    Das heißt jedoch dann nicht automatisch dass es nicht weiter existiert.

    Woher wollen wir z. B. wissen dass die Variable $iPop im Hintergrund nicht unnötigerweise zweimal ausgewertet wird?

    Habe noch ein paar Tests dazu gemacht und kann es nun auf eine AutoIt-Version eingrenzen.
    Bei mir tritt es erst zwischen Version 3.3.10.2 (egal ob x64 oder x86) und AutoIt-Version 3.3.8.1 auf. 3.3.8.1 hat den Bug nicht, 3.3.10.2 hat ihn. Die Versionen dazwischen habe ich nicht.

    Zeitriss: Willst du da einen Bug-Report erstellen oder soll das ein anderer machen?

    Einmal editiert, zuletzt von AspirinJunkie (24. Oktober 2017 um 15:15)

  • Hi,

    Ich bin nicht besonders scharf darauf das Problem auf Englisch zu beschreiben, als Legastheniker habe ich genug mit der deutschen Sprache zu kämpfen.

    Wenn also jemand willig ist kann er gerne den Report schreiben. [Edit:Danke AspirinJunkie]

    Ich würde mich ansonsten frühstens am Wochenende damit befassen.


    autoiter:

    Verwendest du vielleicht eine ältere Version? Bei mir klappt das. [Edit: Mein Fehler siehe Beitrag #7)

    mfg

    Zeitriss

    2 Mal editiert, zuletzt von Zeitriss (24. Oktober 2017 um 16:14)

  • Ich bin nicht besonders scharf darauf das Problem auf Englisch zu beschreiben, als Legastheniker habe ich genug mit der deutschen Sprache zu kämpfen.

    Wenn also jemand willig ist kann er gerne den Report schreiben.

    Ich würde mich ansonsten frühstens am Wochenende damit befassen.

    Wenn ihr möchtet, kann ich einen ausformulierten Bugreport gerne übersetzen.

    Edit : F*ck - kaum auf Absenden gedrückt, da erschien bereits der Beitrag von AspirinJunkie !

    Gruß Musashi

    86598-musashi-c64-png

    "Am Anfang wurde das Universum erschaffen. Das machte viele Leute sehr wütend und wurde allenthalben als Schritt in die falsche Richtung angesehen."

    • Offizieller Beitrag

    Ist ja krass, das Ticket wurde geschlossen - kein Bug (sondern Duplikat, Problem seit 3 Jahren bekannt und ignoriert)!

    Zitat von BrewManNH

    It calls the function the first time to see what element of the array to set it to, then when AutoIt does the actual declaration for the element it calls it again to see where it's going.

    Sorry, aber das ist gequirlte Kacke! Dann sollte das Problem ja nicht auftreten, wenn man den Ausdruck so darstellt: ....$aArr[ ( _function() ) ]

    Das würde erzwingen, dass erst der Ausdruck in der runden Klammer aufgelöst wird und NUR dieser an die eckige Klammer ausgegeben wird. Aber auch in diesem Fall wird die Funktion doppelt ausgeführt.

    Aber das bestätigt nur die bisherigen Erfahrungen mit Bug-Meldungen im EN-Forum: Wie kann ein User sich erdreisten, das Machwerk der Götter in Frage zu stellen!? :Face:

    EDIT:

    Es ist ja gar nicht so weit hergeholt, dass man den Index für die Arrayadressierung mit einer Funktion bestimmen läßt. Und dass der Funktionsaufruf (dessen Return ja der Index ist) direkt in die Zuweisung eingesetzt wird ist auch nicht exotisch.

    Wollte man jetzt diese Art der Adressierung trotz des Bugs vornehmen, muss man die Funktion mit dem Index-Return manipulieren:

    Das hat schon ein bischen was Perverses.

    Es bleibt also nur, Wert vorher in eine Variable übernehmen und dann zuweisen.

  • Klassischer Fall von Hybris :Face:

    Da das Problem früher schon mal gemeldet wurde, steht das Ganze übrigens unter :

    https://www.autoitscript.com/trac/autoit/ticket/3003

    Folgendes Statement finde ich auch recht 'interessant' :

    Zitat von BrewManNH :

    So, I don't know if this is a bug, but it looks like a bad idea to use a function call to determine where in an array to put something, at least don't do it in the actual declaration statement, because you won't be able to be 100% sure it's going where you think it's going.

    Schnellübersetzung :

    Ich kann nicht sagen ob dies ein Bug ist, aber es erscheint mir als schlechte Idee, einen Funktionsaufruf zu verwenden um zu ermitteln, wo in einem Array etwas gesetzt werden soll. Auf jeden Fall nicht in der eigentlichen Deklarationsanweisung, da man nicht zu 100% sicher sein kann, dass es auch dort landet, wo man es vermutet.

    Es gilt wohl das alte Motto : It’s not a bug, it’s a feature ("Es ist kein Fehler, sondern ein Leistungsmerkmal.")

    Gruß Musashi

    86598-musashi-c64-png

    "Am Anfang wurde das Universum erschaffen. Das machte viele Leute sehr wütend und wurde allenthalben als Schritt in die falsche Richtung angesehen."

  • Ist ja krass, das Ticket wurde geschlossen - kein Bug (sondern Duplikat, Problem seit 3 Jahren bekannt und ignoriert)!

    Nicht ganz. Das es kein Bug ist hat keiner gesagt. Unser Ticket wurde lediglich mit Verweis auf ein schon bestehendes geschlossen.

    Dieses Ticket wiederum ist noch offen und trotz einer Diskussion darüber weiterhin als Bug geführt.
    Also offiziell wird es auch weiterhin als Bug geführt. Was damit passiert - deren Entscheidung.

    It calls the function the first time to see what element of the array to set it to, then when AutoIt does the actual declaration for the element it calls it again to see where it's going.

    Das würde bedeuten AutoIt hatte vor v. 3.10 den Bug dass es nur einmal den Index ausgewertet hat und mit 3.10 haben sie diesen behoben... :D

    Aber das bestätigt nur die bisherigen Erfahrungen mit Bug-Meldungen im EN-Forum: Wie kann ein User sich erdreisten, das Machwerk der Götter in Frage zu stellen!?

    Ja treibe mich da auch nur ungern herum. Die Umgangsformen untereinander dort sagen mir überhaupt nicht zu.