Statische Variablen in Funktionen

  • Guten Tag,

    eine Frage an die AutoIt-Insider:

    Wie ernst ist diese Warnung zu nehmen? Ich liebe statische Variablen, würde sie aber nicht verwenden, wenn das Risiko der Abschaffung tatsächlich noch besteht.

    Einmal editiert, zuletzt von Großvater (30. September 2010 um 06:25)

  • @Großvater.

    Statische Variablen benutze ich viel in meine Skripte und habe bisher nur gute Erfahrung mit dem Einsatz von statischen Variablen in Funktionen gemacht.

  • Also ich habe noch nie diese "Funktion" benutzt.
    Ich deklariere das einfach mit Dim $variable = 1 und ferig.

    Wenn die Entwickler schon warnen, dann würde ich nicht alle deine Skripte darauf aufbauen.

    MfG
    Der_Doc

  • Ich komme mittlerweile gar nicht mehr ohne Static aus.
    Falls es sie in einer neuen AutoIt Version nicht mehr geben würde, dann wäre das ein guter Grund für mich nicht zu updaten!

    /signed

    Ich benutze eigentlich garkeine globalen variablen mehr, wenn sie sich in Statics auslagern lassen.

  • Vorteile:

    • Alle Instanzen einer Funktion können ein und dieselbe Variable nutzen (Anwendungsfall z.B.: rekursive Funktionen welche z.B. eine Ausgabevariable gemeinsam beschreiben)
    • Variable ist wie Local nicht außerhalb der Funktion nutzbar was Doppelbelegungen von gleichnamigen globalen Variablen verhindert.
    • Die Variable nimmt nur 1x Platz im Speicher ein - egal wie oft die Funktion aufgerufen wird (Vergleich zu local)


    Nachteile:

    • Variable wird beim ersten Aufruf der Funktion erstellt und bleibt bis zum Ende des Programmes im Speicher auch wenn die Funktion beendet wurde.
    • Zugriff auf Static/Global Variable könnte langsamer sein als Local da Variable nicht im Stack gespeichert wird. (Kann ich aber nicht genau sagen da ich nicht weiß wie AutoIt intern arbeitet)
  • Alle Instanzen einer Funktion können ein und dieselbe Variable nutzen (Anwendungsfall z.B.: rekursive Funktionen welche z.B. eine Ausgabevariable gemeinsam beschreiben)


    Ließe sich mit Global machen. Aber wenn die Variable in der Funktion deklariert wird dann kommt man schon ins Stolpern
    Müsste das dann Static Global sein ?

    Variable ist wie Local nicht außerhalb der Funktion nutzbar was Doppelbelegungen von gleichnamigen globalen Variablen verhindert.


    :love::love: Static :love::love: Endlich etwas gefunden was genau das macht

  • Das heißt nur:

    [autoit]

    Static $Variable

    [/autoit]

    Hab ich auch schon mehrmals verwendet. Echt super. Wenn man wirklich eine Variable in nur einer Funktion verwendet und man möchte das es den Wert behält wenn die Funktion zu Ende ist, muss man dann nicht extra Global deklarieren.

  • Sehr gut find ich Static beim Debuggen.

    Wenn ich z.B. wissen will wie oft eine Funktion aufgerufen wird oder wieviel Zeit dazwischen vergeht:

    [autoit]

    HotKeySet("{ESC}", "_Exit")

    [/autoit][autoit][/autoit][autoit]

    While 1
    Sleep(Random(100, 1000))
    _Func()
    _Func2()
    WEnd

    [/autoit][autoit][/autoit][autoit]

    Func _Func()
    Local Static $iTimer
    ConsoleWrite(TimerDiff($iTimer) & @CRLF)
    $iTimer = TimerInit()
    EndFunc

    [/autoit][autoit][/autoit][autoit]

    Func _Func2()
    Local Static $iCnt = 0
    ConsoleWrite($iCnt & @CRLF)
    $iCnt += 1
    EndFunc

    [/autoit][autoit][/autoit][autoit][/autoit][autoit]

    Func _Exit()
    Exit
    EndFunc

    [/autoit]


    Oder auch Rekursiv

    [autoit]

    _Rekursiv()

    [/autoit][autoit][/autoit][autoit]

    Func _Rekursiv()
    Local Static $iCnt = 0
    ConsoleWrite($iCnt & @CRLF)
    $iCnt += 1
    If $iCnt > 10 Then Return
    _Rekursiv()
    EndFunc

    [/autoit]
  • Guten Morgen,

    Allen herzlichen Dank für die Antworten. Dann werde ich die Statics also nutzen.

    Es würde mich allerdings schon interessieren, warum dieser abschreckende Hinweis in der Hilfe steht. Hat Jemand eine Ahnung?

    Danke! ;)

  • Naja, ansich unterscheidet sich eine "Global"-Variable speichertechnisch nicht von einer Static. Nur passt es etwas besser in den Stil, möglichst wenig "Global" zu verwenden (wieso eigentlich? ) und die statischen Variablen, die einfach für den Zugriff ausserhalb "ihrer" Funktion gesperrt werden, zu benutzen. Speichertechnisch bleibt das Jacke wie Hose.
    Static bedeutet zwar Mehraufwand (für den Interpreter), aber zielt wohl in die Richtung "Kapselung" im Bezug auf Objektorientierung und da kommt auch die Frage von Großvater ins Spiel

    Zitat

    warum dieser abschreckende Hinweis in der Hilfe steht.

    Prog@ndy wird da sicher mehr darüber wissen, ich vermute einen Zusammenhang mit der AutoItObject, OOP für AutoIt. Die Dev´s werden STATIC implementiert haben und sich "vorsichtshalber" einen Rückweg offen gelassen haben, falls es aus irgendwelchen Gründen zu unvermuteten Seiteneffekten kommt. Aber was war mit dem Mann, der aus dem 10. Stock eines Hochhauses fiel? Bei jedem Stockwerk an dem er vorbeiflog hat er gesagt:" Bis jetzt gings gut!" :thumbup:

  • Nur passt es etwas besser in den Stil, möglichst wenig "Global" zu verwenden (wieso eigentlich? )


    Hast du ja eigentlich schon beantwortet: Kapselung.
    Aber nicht speziell nur im objektorientierten Sinn sondern allgemein bei der modularisierten Programmierung wie sie ja auch in AutoIt zur Anwendung kommt.
    Wenn man ein Programm aus vielen Modulen (bei AutoIt halt die UDF´s) zusammenbaut und jede Funktion globale Variablen deklariert kann es durchaus vorkommen dass 2 Funktionen dafür den selben Variablennamen nehmen.
    Damit die Module dann wie gewünscht zusammen laufen müsste der User dazu erst eine UDF umschreiben.
    Static ist daher eine willkommene Lösung zu diesem Problem.
    Das diese dabei speichertechnisch gleichzusetzen ist wie global ist klar.

  • Vielleich habe ich ja nicht aufgepasst, aber wenn das passiert...

    Zitat von Übersetzung

    Es stellte sich heraus, dass die globale Klasse die von der neuen Klasse erbte, erstellt wurde und versuchte die Funktionsliste zu verwenden, bevor diese Liste initialisiert wurde. In einer Anwendung, die globale Variablen nicht missbraucht, würde das nie geschehen.

    ...ist doch irgendetwas am Konzept/Compiler falsch! Ich hatte schon von diesem Problem in anderem Zusammenhang gelesen, das tritt ab und zu auf (wie von Valik beschrieben nicht immer! ) wenn Compiler den Code "kaputtoptimieren" indem sie u.a. Variablen umsortieren und dabei "übersehen" daß auf Variablen zugegriffen wird, für die zwar Speicher alloziert wurde, aber die noch nicht initialisiert sind.
    Daher wird auch in einem Intel-Dokument beschrieben, daß man entweder den Compiler komplett selbst optimieren lassen (d.h. "einfachen" Code schreiben) oder div. Compileroptionen im Zusammenhang mit bestimmten handoptimierten Funktionen garnicht nicht benutzen soll!

    Bei einem Compiler verstehe ich das (teilweise) noch, aber bei einem Interpreter, der stur nacheinander seine Instruktionen abarbeitet, kapiere ich das überhaupt nicht! Sämtliche "Global Const xxxx" werden in reihenweisen Include-Dateien definiert (wo sonst) und eingebunden, aber wenn ich ein Script schreibe, soll ich Globals weitgehend vermeiden? ?(

    Oder ist die Verwendung von Global innerhalb einer Funktion gemeint? Da würde sich auch mir der Magen umdrehen^^
    Dann würde ich auch das nachvollziehen können:

    Zitat von AspirinJunkie

    Wenn man ein Programm aus vielen Modulen (bei AutoIt halt die UDF´s) zusammenbaut und jede Funktion globale Variablen deklariert kann es durchaus vorkommen dass 2 Funktionen dafür den selben Variablennamen nehmen.

    Mir wäre nie im Traum eingefallen, eine Variable innerhalb einer Funktion als Global zu definieren

    /Edit/ wäre ggf mal ein Verbesserungsvorschlag, das Verwenden von Globals innerhalb einer Funktion zu verbieten....

  • Ja ich denke die pauschalisierte Aussage das globale Variablen prinzipiell schlechter Stil sind ist einvernehmlich nicht haltbar.
    Weiß auch nicht wer das geäußert hat.
    Globale Variablen machen durchaus Sinn, eben z.B. als angesprochene globale Konstanten.
    Zum schlechten Stil verkommen sie erst wenn sie entweder innerhalb Funktionen gesetzt werden (aus den genannten Gründen) oder global gesetzt werden obwohl dies nicht nötig wäre.
    Z.B. wenn man Variablen welche eigentlich nur in einer Funktion benötigt werden dennoch global deklariert.

    Andy deinen Vorschlag würde ich sofort unterschreiben.
    Mir fällt kein Anwendungsfall dafür ein solange es ByRef und Static gibt.

    • Offizieller Beitrag

    Dieses ganze Variablenproblem liegt m.M. zum Teil auch dadrin begründet, dass AutoIt (leider) geradezu zu schlampiger Programmierung verleitet. Ich nehme mich da auch gar nicht von aus: Es ist halt einfach sehr bequem eine Variable dann zu deklarieren, wenn man sie gerade benötigt.
    Früher (seeehr viel früher :D), als ich noch mit z.B. TurboPascal gearbeitet habe, kannte ich es gar nicht anders, als alle Variablen am Programmanfang zu deklarieren. Dies würde ich mir noch für AutoIt wünschen.