Variablen und Pointer

  • Hallo liebes Forum,

    ich stehe vor folgendem Problem:

    ich will den Pointer einer Variablen aus meinem Skript erlangen. Damit ich den Pointer zwischenspeichern kann und falls diese Variable dann geändert wird ich aber über den zwischengespeicherten Pointer trotzdem noch an die Variable komme bzw deren Wert. Hat irgendwer eine Idee wie ich Sowas realisieren kann?

  • Es gibt in AutoIt keine Pointer oder Referenzen per se.
    Du kannst du bei Funktionsaufrufen eine Variable ByRef anstatt per Kopie übergeben.

    Wenn du aber wirklich Pointer brauchst dann kannst du mit DllStructs einen Workaround machen.

  • Danke schonmal :)

    das mit dem DllStruct schaue ich mir mal an aber es ist so ich Habe eine Variable $Array die ist mit daten befüllt.
    Die Daten werden immermal wieder geändert aber gleichzeitig brauche ich eine Referenz auf diese Variable um mit den Daten zu arbeiten um nicht eine "alte Version" der $Array Variable zu haben.

    Wie gesagt ich schau es mir mal an und melde mich dann :D

  • Wo genau liegt das Problem? Beispielscript das das Problem veranschaulicht?

    Ist deine Variable global oder local? Wo und wie wird sie verändert? Handelt es sich um eine lokale Variable kommt evtl. noch eine "static local" Deklaration in Frage, sofern der Variableninalt für den nächsten Funktionsaufruf erhalten bleiben soll. Bei einer globalen Variable sehe ich überhaupt kein Problem, diese hat immer den letzten gesetzten Wert und ist funktionsübergreifend les- und veränderbar.

  • Wenn die Variable aber immer lokal ist muss sie ja zB über Funktionsparameter ihren Wert erhalten.
    Da kannst du dann gleich ByRef verwenden.

  • Es handelt sich dabei um eine Lokale Variable und oben im ersten Post hatte ich etwas was ich mir vorgestellt habe


    Nun es ist aber unverständlich was du dir hier vorstellst oder was du überhaupt erreichen willst. Dein Beispiel oben ergibt so jedenfalls keinen Sinn bzw in deinem Beispiel sind überhaupt keine weiteren Maßnahmen notwendig um das gewünschte zu erreichen. Führt man dein obiges Script so aus wie es Autoit vorsieht kommt genau das raus was du haben möchtest:

    Also nochmal:
    Schreibe ein kurzes Beispielscript in dem das Verhalten auftritt, welches du so nicht erwartest. Dann kann man dir auch erklären wie du das in Autoit richtig machst.

    Da du von einer lokalen Variable sprachst schaut dein Script vermutlich so aus:

  • Hi,
    nachdem ich diesen Thread schon mehrfach durchgelesen habe, kann ich mir (hoffentlich) vorstellen, um was es dem TE geht:
    Beim Start des Programms wird ein Array erstellt, dieses bekommt die Daten "irgendwoher", ich sage jetzt mal "Textdatei".
    Das Programm läuft und nun werden die im Array stehenden Daten ver/be-arbeitet. Zwischenzeitlich aktualisiert sich die Textdatei.
    Mal angenommen, die Textdatei besteht aus 100000 (hunderttausend) Einträgen, und es wird aber immer nur einer "aktualisiert", dann müsste jedes Mal vor dem Ver/be-arbeiten der Arrayitems das komplette Array aktualisiert werden...
    Soweit meine Vermutung!
    Und jetzt, WO IST DABEI DAS PROBLEM? Genau DAFÜR wurden Computer gebaut und entwickelt, um diese aufwendigen Arbeiten zu erledigen...
    Wenn der Aktualisierungsvorgang zu lange dauert, dann ist das ein anderes Thema!

    Wo ist das Script?!
    Wieder mal X-Y-Problem?! (siehe Sig)

  • Also mein Problem werde ich nochmal hier veranschaulichen:

    Ich habe sehr viele Controls die ich mit einer Variablen "verknüpfen" möchte. Die Variablen haben verschiedene Daten die in die Controls sollen aber vom User bearbeitet werden können (in Form von Edits, Buttons etc.). Die Controls sollen mit den Daten aus der anfangsvariablen aktualisiert werden (sprich hier $sDaten). $sDaten wird vorher in dem Array $aCtrl mit dem Control "verknüpft". Wenn ich aber jetzt $sDaten ändere (durch drücken auf den Button) soll es das Label aktualisieren. Wenn ich aber einen Pointer in $aCtrl hätte könnte ich immer darauf zugreifen. Es ist nämlich einfacher das ganze so für mich aufzubauen. Die Datenbearbeitung wird höchstens ein paar Zeilen beanspruchen. Da es halt nur viele Controls sind und ich ein einheitliches System habe was die Daten angeht könnte ich so einfach nur die For-Schleife abarbeiten. Ich hoffe das bringt etwas Licht ins dunkle.

  • Script ist jetzt da, aber was soll passieren, wenn man auf den Button drückt?
    Und mach dir klar, was ein "Pointer" ist! Ein Pointer ist nichts weiter als ein Index in einem Array...

    Ich verstehe nicht, was du machst....
    In der Schleife fragst du das Array ab, aber beim Klick auf den Button bearbeitest du einen String?!

    addDataToCtrl() wird nur ein Mal aufgerufen?!

    So?

  • Ich drücke mich echt falsch aus. Ich will doch einfach nur wissen wie ich einen Pointer auf eine Variable erzeugen kann. Was ein Pointer ist ist mir klar. Dass es sie in AutoIt nicht gibt ist mir ebenfalls klar, aber wie kann ich etwas ähnliches erhalten. Der Sinn mag euch vielleicht nicht offensichtlich sein aber ich kann auch nicht alles Verraten da es um Betriebsgeheimnisse geht.

    Und mach dir klar, was ein "Pointer" ist! Ein Pointer ist nichts weiter als ein Index in einem Array...

    Mag ja sein aber ein Index in einem Array kann sich ändern/verkürzen und dann müsste ich alle nachfolgenden Indizes ändern...

  • Betriebsgeheimnis?

    Ähm langsam wirds kindisch. Bin raus hier, da du dein Problem nicht ausreichend und klar genug beschreiben kannst oder willst. Die Lösung bleibt vermutlich auch für immer ein Betriebsgeheimnis der Autoit Gemeinde.

  • Ich drücke mich echt falsch aus. Ich will doch einfach nur wissen wie ich einen Pointer auf eine Variable erzeugen kann.

    Vor allem kannst du auch kein Beispielskript liefern, daß die Notwendigkeit verdeutlicht. Dies zusammen mit deiner (Betriebs-)Geheimniskrämerei macht das Ganze sehr suspekt.

  • Mag ja sein aber ein Index in einem Array kann sich ändern/verkürzen und dann müsste ich alle nachfolgenden Indizes ändern...

    Wo hast du denn diese Weisheiten her? Seit wann "kann sich ein Index ändern"? Ein Index in einem Array ist nur ein Zeiger auf einen Wert, also genau der "Pointer", den du brauchst. Ein Index ist auch nicht zu verkürzen/ändern, außer du machst das explizit!
    Und selbst, wenn du bspw. per ArrayInsert() einen Wert im Array einfügen würdest, werden die nachfolgenden Indizes auf die ursprünglichen Werte angepasst.
    Und wenn du Indizes ändern willst/musst und ein Arraysystem nicht so funktioniert wie du das willst, dann ist deine Struktur falsch implementiert. Verwende Listen/verkettete Listen oder eine der zahllosen anderen Varianten, Daten über "Pointer" (Zeiger/Indizes) anzusprechen. S. hier: Alternativen zum Array

  • Um nochmal den Zusammenhang "Pointer - Index" zu erklären... Ein klassisches Array wird über drei Parameter beschrieben: Die Startadresse, die Elementgröße und die Anzahl der Elemente. Im Prinzip stehen ja nur ein Haufen Werte im Speicher hintereinander, erst die Programmiersprache abstrahiert das ganze soweit, dass wir es Array nennen können. Das erste Element (Index 0) findet sich immer bei der Startadresse, ist ja klar. Das zweite Element (Index 1) muss dann direkt nach dem ersten Element stehen. Wenn jedes Element 1 Byte groß ist, ist also das zweite Element bei Startadresse + 1 Byte zu finden. Daher kann man hier eine einfache Formel aufstellen, mit der man aus dem Index die Adresse bestimmen kann: Adresse = Startadresse + Elementgröße * Index. Von daher: Nein, ein Index kann sich rein technisch gesehen nicht ändern, da die Adresse ja auch konstant bleibt. Nur die Elemente können sich ändern.

  • Wenn "Pointer" gewünscht sind, wäre (glaube ich) das einfachste ein "Pointer auf den Pointer".
    Was aber natürlich wie bereits gesagt auch von 2 Arrays abgebildet werden kann. Das eine Array verwaltet die Indizes des anderen.

    Ob das so überhaupt so gedacht und sinnvoll ist, oder ob nicht andere Verfahren besser wären, erschließt sich mir nach 16 Posts immer noch nicht ;(
    Es wird sehr schwierig zu helfen, wenn nicht mal lauffähige Scripte mit "vorher" und "nachher" oder dem gewünschten Weg oder zumindest eine verständliche Erklärung des gewünschten Ergebnisses zur Verfügung stehen.

    Mit Sicherheit ist das auch einer der Gründe, wieso sich bisher kaum die (Array- und Listen- ) Spezialisten zu Wort gemeldet haben!

    Um den Startpost nochmal aufzufassen:

    Die "Variable" $tmp wird nun durch _tmp() ausgedrückt...Ich vermute, das war es, was du auch in der in deinem BeispielScript machen wolltest.
    Natürlich funktioniert es auch, die Variablen mit _tmp(Index) aus einem Array zuzuweisen. Index ist hier der "Pointer".

    ciao
    Andy


    "Schlechtes Benehmen halten die Leute doch nur deswegen für eine Art Vorrecht, weil keiner ihnen aufs Maul haut." Klaus Kinski
    "Hint: Write comments after each line. So you can (better) see what your program does and what it not does. And we can see what you're thinking what your program does and we can point to the missunderstandings." A-Jay

    Wie man Fragen richtig stellt... Tutorial: Wie man Script-Fehler findet und beseitigt...X-Y-Problem

    Einmal editiert, zuletzt von Andy (4. April 2016 um 06:15)

    • Offizieller Beitrag

    Ich habe diesen Thread bestimmt 5 mal gelesen, ohne mit Sicherheit sagen zu können, was der TE überhaupt will. ;(
    Mein Eindruck: Du hast als erstes nur Verwirrung gestiftet, indem du von Pointern sprichst, obwohl nichts aus deiner sparsamen Beschreibung auf deren sinnvolle Verwendung schließen lässt.
    Wenn du eine Variable im Ursprung nutzen willst, ohne eine Kopie anzulegen, musst du ByRef arbeiten - das wurde dir schon ganz am Anfang empfohlen. Anscheinend hast du diese Empfehlung ignoriert.
    Auch ein Array kannst du ByRef bearbeiten.
    Bring mal ein Bsp. Skript ohne dieses unnütze Pointer-Gedöns (s. X-Y-Problem), dann sehen wir weiter.

  • Eventuell will der TE aber lediglich die Speicheradresse der Variable von AutoIt heraus bekommen... um diese eventuell auf etwas anderes zeigen zu lassen? Wo soll das hin führen?

    Es gibt sehr viele Leute, die glauben. Aber aus Aberglauben.
    - Blaise Pascal

  • Schau mal das Script im Startpost, das Beispielscript des TE und mein Script im Post #17.
    Ich bin mir jetzt ziemlich sicher, dass eine Art "Pointer auf Pointer" gemeint ist bzw. das Ziel ist.

    Angenommen, $arrayinhalt[indizes] ändert die Werte/Inhalte, du willst aber mit $Variable1 immer auf $arrayinhalt[1] zugreifen, dann könntest du statt $Variable1=$arrayinhalt[1] zu schreiben auch bspw die Funktion _Variable1() nutzen, welche dir den Inhalt von $arrayinhalt[1] zurückgibt. Und genau hier könnte auch ein komplettes Array abgebildet werden!
    Das ist nichts weiter als der Austausch von $ als Variablenkennung und _ als Funktionskennung-

    Ich bin ziemlich sicher, dass AutoIt in einer der neueren Versionen Variablen ohne $-Kennung und Funktionsaufrufe ohne () unterstützt. Das würde dem TE wahrscheinlich auch reichen...
    Kann aber auch sein, dass dieses Verhalten in einer Beta vorlag und nie released wurde.