Array eingelesen - wo ist es?

  • Hallo,
    vll. eine etwas komische Frage, aber ich frage sie dennoch: Wenn ich ein Array in Autoit erstelle, dann muss es sich ja auch irgendwo im Speicher befinden, richtig?
    Ist es möglich dieses Array mit anderen Programmen, oder mit einem anderen Autoit-Script auslesen? Man müsste ja eig. nur die Speicheradresse wissen,
    oder ist das so einfach nicht?

    • Offizieller Beitrag
    Zitat

    oder ist das so einfach nicht?


    Wenn es so einfach wäre, gäbe es nicht unzählige Threads zur Interscriptkommunikation. ;)

  • So einfach wird es wohl nicht sein, denn es kommt darauf an, wie das Array im Speicher aufgebaut ist.

    In AutoIt ist es simple: Dim $array[10] und du hast dein Array!

    Aber wie sieht Struktur im Speicher aus?

    Wenn du den Pointer des Arrays kennst und es ist genauso aufgebaut wie in AutoIt, dann kannst du es bestimmt "anzapfen".


    Gruß,
    UEZ

    Auch am Arsch geht ein Weg vorbei...

    ¯\_(ツ)_/¯

  • Wenn ich mich an einen Post von Andy errinnere, dann würde ich ganz vage behaupten, dass das fast ein Himmelfahrtskommando darstellt.
    Die Arrays sind wohl sehr verwurstelt im Speicher angelegt, Andy hat da dann glaub ich auch aufgegeben.

    Wenn du allerdings nur Arrays zwischen Programmen "hin und herschicken" willst, dann such mal nach der Exchange Variables UDF von Eukalyptus (?).

  • Hi,
    ja, ich hatte das Vorhaben, die Strukturen eines universellen Arrays herauszufinden, aufgegeben. War sowieso nur interessehalber eine Beschäftigung für lange Winterabende :P

    Das Problem hängt nicht zuletzt mit dem meiner Meinung nach sehr guten Feature von Autoit zusammen, keine Variablentypen definieren zu müssen.
    Man kann ein Array ohne weiteres als

    [autoit]

    dim $a[3]=[3.1415926,"blablub",chr(0)]

    [/autoit]

    beschreiben.
    Um jetzt einen String, ein Float und einen Verweis in einem "Array" unterzubringen, gibt es mehrere programmtechnische Möglichkeiten und deren Kombinationen. Sehr einfach wären z.B. verkettete Listen.
    Allerdings ist das RE alles andere als trivial...
    Mal einen x-beliebigen Wert in ein "Array" zu schreiben und diesen dann im Speicher zu suchen um daraufhin den Pointer auf den Wert zu erhalten, der wiederum ja auch irgendwo im Speicher auf das "Array" verweist, ist nicht das Problem. Das Problem ist, die "Struktur" (struct ...sic) im Speicher zu finden bzw. den Einsprungpunkt in diese verkettete Liste (wenn es überhaupt eine ist ^^)

    Zitat von Scritch

    Wenn ich ein Array in Autoit erstelle, dann muss es sich ja auch irgendwo im Speicher befinden, richtig?

    :o), wenn DU ein "Array" erstellst, und es nicht aus wahllosen Datentypen besteht, dann frag dich mal, wieso du ein "Array" erstellst, statt einer Struct, bei der du einen Pointer auf die Daten bekommst!

    Zitat von Scritch

    Ist es möglich dieses Array mit anderen Programmen, oder mit einem anderen Autoit-Script auslesen? Man müsste ja eig. nur die Speicheradresse wissen, oder ist das so einfach nicht?

    s.o, den per dllstructgetptr() erhaltenen Pointer kannst du selbstverständlich per einfacher Message an andere Programme schicken.

    Zitat von UEZ

    Wenn du den Pointer des Arrays kennst und es ist genauso aufgebaut wie in AutoIt, dann kannst du es bestimmt "anzapfen".

    genau DAS ist das Problem. AutoIt verwendet imho nicht die Pointer direkt, sondern erstellt eine Kopie der Daten. Schau mal was passiert, wenn du bei einem dllcall einen Pointer in Form von "int*", "ptr*" oder "str*" verwendest. Dann wird clevererweise eine Kopie der Daten verwendet, denn sollte der dllcall aus irgendwelchen Gründen nicht ordendlich funktionieren, wird nur die temporäre Kopie der Daten zerstört, aber nicht das Orginal.
    Man muss schon eine gehörige Portion Enthusiasmus mitbringen, um als AutoIt-Entwickler hunderte bis tausende Zeilen Code zu schreiben und RICHTIG viel Gehirnschmalz einzusetzen, um eine einzige "einfache" Funktion umzusetzen.


    Zusammenfassend:
    Schreibe deine Daten in eine Struct, dann hast du auch einen Pointer. Und btw., Daten in einer Struct zu verändern (schreiben/lesen) ist in etwa genau so schnell wie das Arbeiten mit Arrays.