_ArrayDisplay() kann keine Null-Keywords verarbeiten

  • Guten Tag, liebe Leute.

    Ich habe hier ein Windows 7 Professional 64 Bit und AutoIt 3.3.16.0 mit SciTE installiert.

    Gestern machte ich die Entdeckung, dass _ArrayDisplay() nicht mit Null-Keywords im übergebenen Array umgehen kann und in eine Endlos-Schleife gerät.

    Hier ein Beispiel:

    AutoIt
    #Include <Array.au3>
    
    Dim $Array = [Null, False, True]
    _ArrayDisplay($Array)

    Auch zweidimensionale Arrays sind davon betroffen und die Platzierung des Null-Keywords ist egal.

    Meine Suche ergab, dass der Fehler in der Datei <ArrayDisplayInternals.au3> liegt, welche von <Array.au3> eingebunden wird. Dort wird von der Funktion __ArrayDisplay_Share() über weitere Funktionen die Funktion __ArrayDisplay_SortArrayStruct() aufgerufen. Darin kommt eine Do…Until-Schleife vor, welche bei Null-Keywords mit natürlicher Sortierung endlos läuft, weil in diesem Fall die DllCall()s den in der MSDN undokumentierten Wert -2 zurückgeben, der nicht abgefangen wird. Bei numerischer Sortierung liefern die Number()-Funktionen einfach 0, was zu keiner Endlos-Schleife führen sollte.

    Dabei dient der erstmalige Aufruf von __ArrayDisplay_SortArrayStruct() über vorgeschaltete Funktionen eigentlich nur der Ermittlung der Sortierdauer einer Spalte.

    Man könnte nach der If-Abfrage, also nach Zeile 801 eine Begrenzung mit If $r < -1 Or $r > 1 Then $r = 0 einfügen oder im nachfolgenden Switch-Teil aus Case 0 ein Case 0, -2 oder Case Else machen. Beide Varianten führen zu einem erfolgreichen Abbruch der Schleife bei Null-Keywords.

    Schön wäre es allerdings noch, wenn auch wie bei den Bool-Keywords False und True das Wort Null im ListView der _ArrayDisplay()-GUI erscheinen würde, wenn dieses Schlüsselwort auftritt. Wo das bewerkstelligt werden kann, habe jedoch nicht herausgefunden.

    Gruß, fee

    Einmal editiert, zuletzt von fee (6. Februar 2023 um 21:15)

  • Wer oder was macht soetwas?

    so long

    Peter

    Hinweise auf Suchmaschinen finde ich überflüssig - wer fragt hat es nicht gefunden oder nicht verstanden. Die Antwort gibt sich oftmals schneller als der Hinweis auf Dr. Goggle & Co.

    Ab 19-10-22 ergänzt um:

    Die Welt wird nicht bedroht von den Menschen, die böse sind, sondern von denen, die das Böse zulassen. (Albert Einstein)

  • Ich! ^^ – Für ein Beispiel zu einer eigenen UDF.

    Ist aber egal, Fehler bleibt Fehler, nicht?

    Gruß, fee


    Edit: Außerdem hab ich einen undokumentierten Wert einer WinAPI-Funktion entdeckt.

  • Naja es gibt schlimmere....

    Probiers mal so:

    Include <Array.au3>

    Dim $Array = [0, False, True]

    _ArrayDisplay($Array)

    oder so

    #Include <Array.au3>

    Dim $Array = ["null", False, True]

    _ArrayDisplay($Array)

    Hinweise auf Suchmaschinen finde ich überflüssig - wer fragt hat es nicht gefunden oder nicht verstanden. Die Antwort gibt sich oftmals schneller als der Hinweis auf Dr. Goggle & Co.

    Ab 19-10-22 ergänzt um:

    Die Welt wird nicht bedroht von den Menschen, die böse sind, sondern von denen, die das Böse zulassen. (Albert Einstein)

  • Das ist gar nicht so abwegig.

    Da leere Arraypositionen im Kontext des Zugriffs völlig unterschiedlich interpretiert werden, ist per se keine Abfrage möglich: Ist das Element leer?

    Aus diesem Grund ist es sinnvoll, für echte Leerinfos Variablen oder Arraypositionen mit Null vorzubelegen. Verwende ich ständig. Vor Einführung des Keywords Null musste man da irgendwelche abartigen Vorbelegungswerte generieren um auf tatsächlich leer zu prüfen.

    Insofern halte ich das Problem für nicht sehr exotisch.

  • Ist es auch nicht.

    Das braucht man nicht künstlich klein zu reden. Wenn Arraydisplay bei einem AutoIt-Keyword abschmiert, dann gehört das gefixt und nicht mit Workarounds umgangen.

    Ich selbst kann es gerade nicht testen, aber wenn es sich tatsächlich so wie beschrieben darstellt ist es ein Fall für den >>Issue-Tracker<< (vorher aber mal schauen ob es nicht schon Ticket hierfür gibt)

  • Erst mal vielen Dank euch allen für eure schnellen Antworten.

    Peter S. Taler

    Klar, dass deine Beispiele funktionieren, denn sooo unerfahren bin ich in AutoIt im Gegensatz zu meinem Benutzertitel hier ja nun auch wieder nicht, sonst hätte ich die Fehlerquelle nicht gefunden, nicht wahr? ;)

    AspirinJunkie

    In diesem Forum ist noch die 3.3.16.0 verlinkt, weshalb ich meinen Gedanken an ein Update wieder verwarf.

    Der Fehler ist zwar behoben, aber meiner Meinung nach mit der Holzhammer-Methode, indem jeder Wert "einfach" in einen String umgewandelt wird. Außerdem wird das Schlüsselwort Null im ListView einfach als leeres Feld dargestellt statt in seiner Textform, wie es bei den Schlüsselworten Default, False und True der Fall ist.

    Jedenfalls kann ich jetzt wieder endlos weiterarbeiten statt endlos aufs Skriptende zu warten … ^^

    Gruß, fee

    Edit: Obendrein würde bei der Ausgabe von Null in Textform die Umwandlung in einen String für die DllCalls hinfällig werden, denke ich und sich auch noch von Feldern mit "leeren Strings" unterscheiden, was vor allem bei einer Sortierung nicht schlecht wäre.

    2 Mal editiert, zuletzt von fee (6. Februar 2023 um 21:17)

  • Moin.

    Ich habe jetzt nur die Überschrift gelese und frage mich: "kann keine Null-Werte verarbeiten". Okay, wieso dann nicht alle Werte +1 nehmen?
    Also aus der "NULL" eine "1" machen und wenn man das Array anspricht und damit arbeiten möchte, einfach nach dem "aus dem Array lesen", -1 rechnen?

    Theoretisch sollte das aus meiner Sicht und mit meinem noch kleinen Wissen in diesem Bereich machbar sein. Frage wäre wieß

    Lieben Gruß,
    Alina

    ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

    Geheime Information: ;)
    k3mrwmIBHejryPvylQSFieDF5f3VOnk6iLAVBGVhKQegrFuWr3iraNIblLweSW4WgqI0SrRbS7U5jI3sn50R4a15Cthu1bEr

  • fee 6. Februar 2023 um 21:12

    Hat den Titel des Themas von „_ArrayDisplay() kann keine Null-Werte verarbeiten“ zu „_ArrayDisplay() kann keine Null-Keywords verarbeiten“ geändert.
  • Alina

    Es geht um das Keyword Null, nicht um den banalen Wert 0. Da drückte ich mich missverständlich aus und sorgte damit wohl nicht nur bei dir für Verwirrung.

    Bitte verzeiht mir diesen Benennungsfehler, den ich nun überall berichtigt habe.

  • fee, so war ds nicht gemeint. Ich hatte mich ja "nur" auf die Überschrift bezogen.
    Das Missverständnis schätze ich war bei den anderen nicht vorhanden. ;)


    Zum Glück sagt mir der Begriff Keyword in diesem Zusammenhang etwas. ;)

    Lieben Gruß,
    Alina

    ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

    Geheime Information: ;)
    k3mrwmIBHejryPvylQSFieDF5f3VOnk6iLAVBGVhKQegrFuWr3iraNIblLweSW4WgqI0SrRbS7U5jI3sn50R4a15Cthu1bEr