Array ByRef in SubSkript registrieren?

  • Ich stehe gerade etwas auf der Leitung.

    Ich habe ein Skript, das ich includieren möchte. Von dort aus soll auf ein sich im Hauptskript befindliches Array mit wechselnden Inhalten, intervallmäßig zugegriffen werden.

    Deshalb habe ich eine Registrierfunktion, über die das Hauptskript das Array an das SubSkript meldet.

    Aber es nutzt ja nichts, wenn ich einer im SubSkript definierten Variable die Arrayvariable aus dem Hauptskript zuweise, das Array wird dann ja nur einmalig mit aktuellem Inhalt kopiert.

    Ich müsste ByRef zugreifen, also schick wäre ja sowas: $a_Sub = ByRef $a_Main - OK, geht nicht.

    Habt ihr einen Ansatz?

  • Kannst du vielleicht ein kleines Beispiel basteln? Denn ich bin mir nicht ganz sicher, was das Problem ist.

    Auch am Arsch geht ein Weg vorbei...

    ¯\_(ツ)_/¯

    • Offizieller Beitrag

    Ich habs mal als lauffähiges Bsp. exrahiert:

  • Ich vermute, dass bei dieser Aktion (AdlibRegister) der Speicher intern kopiert wird und somit die Änderungen des Arrays nicht aktualisiert werden.

    Dies funzt:

    AutoIt
    While True
        Sleep(50)
        _FillArray($aData)
        _Register_Array($aData, 50)
        _Run()
    WEnd

    Auch am Arsch geht ein Weg vorbei...

    ¯\_(ツ)_/¯

    • Offizieller Beitrag

    Ja, das ist mir klar. ByRef ist nur als Funktionsparameter möglich. Adlib ist aber parameterlos und somit wird das Anfangsarray nur kopiert und in der Sub wird nur auf diese Kopie, die sich leider nicht aktualisieren lässt, zugegriffen.

    Ich hoffte nur, dass jemand einen genialen Hack kennt, um das irgendwie zu realisieren. ;)

  • Angenommen es würde funktionieren wie du es willst... ist Adlibregister dann überhaupt eine sinnvolle Wahl? Die in Adlibregister registrierte Funktion zur Verarbeitung könnte deine Funktion zum neu Befüllen deines Arrays unterbrechen. Angenommen das passiert bei 50% des Füllvorgangs, dann verarbeitest du zur Hälfte "alte" Daten und zur Hälfte "neue" Daten. Wenn das ein Problem wäre kommt das so ohnehin nicht in Frage.

  • Angenommen das passiert bei 50% des Füllvorgangs, dann verarbeitest du zur Hälfte "alte" Daten und zur Hälfte "neue" Daten. Wenn das ein Problem wäre kommt das so ohnehin nicht in Frage.

    Das Array würde natürlich ein Element enthalten, dass den Status mitteilt. Eine Verarbeitung würde davon abhängig sein.

    Das Hauptskript soll nur Daten von verschiedenen Quellen einsammeln und diese werden dann in einem anderen Skript verarbeitet.

    Ich werde mal versuchen, mit DllCallback zu arbeiten. Da habe ich dann Pointer zur Verfügung und somit einen Zugriff ByRef. Nur bin ich dann wieder beschränkt bei der Flexibilität meiner Datentypen.

  • Das Hauptskript soll nur Daten von verschiedenen Quellen einsammeln und diese werden dann in einem anderen Skript verarbeitet.

    In Freebasic kann man den Pointer von einem Array übergeben und somit direkt in den Speicher schreiben. In Autoit, soweit ich weiß, geht das leider nicht. Falls die Daten immer den gleichen Typ haben, könnte man auch eine Struct anstelle eines Arrays benutzen und den Pointer zur Struct übergeben.

    Auch am Arsch geht ein Weg vorbei...

    ¯\_(ツ)_/¯

  • Ich habe mich jetzt anders entschieden.

    Da das Hauptprogramm sowieso irgendeine Funktion am Laufen hat, die die Daten in das Array speichert, ist es doch auch kein Problem eine Funktion aufzurufen um das fertige Array zum Subskript zu kopieren. Dort wird einfach regelmäßig abgefragt, ob was Neues da ist, wenn ja wird es verarbeitet. Anhand meines obigen Bsp. könnte man das dann so machen:

    P.S.

    Das ist jetzt nur ein funktionales Bsp. Natürlich muss man berücksichtigen, dass evtl. Zeitdifferenzen auftreten in Zusammenstellung und/oder Verarbeitung. Insofern würde ich neue Daten sinnvollerweise in einem Puffer sammeln und von dort abarbeiten.

  • BugFix 18. August 2021 um 11:11

    Hat das Label von [ offen ] auf [ gelöst ] geändert.