Statische Variablen in Funktionen

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


    Am Anfang gab es Probleme mit Arrays, die als statische Variable deklariert wurden. Genauer, bei der Benutzung von ReDim mit einer statischen Arrayvariable.
    Ob der Fehler inzwischen behoben wurde weiss ich nicht, aber könnte gut sein. Und ebenso könnte es gut sein, das einfach vergessen wurde, den Warnhinweis zu entfernen (wäre nicht das erste mal).

    Bei einem normal kompilierten Programm werden statische Variablen meist im __BSS Segment angelegt. Hier haben wir es aber mit einem Interpreter zu tun, der die Variablen aus dem Skript zur Laufzeit erzeugt.

    Andy
    Du kannst in ASM statische Variablen in Funktionen z.B. so implementieren:

    Spoiler anzeigen
    Code
    MyProc proc stdcall uses ebx, hwnd:HWND, message:UINT, wParam:WPARAM, lParam:LPARAM
    	_BSS segment DWORD public 'BSS'
    	myStaticVar dword 0DEADh
    	_BSS ends
    
    
    	mov ebx, myStaticVar
    	; ...
    	ret
    MyProc endp


    Gruß
    Greenhorn


    Einmal editiert, zuletzt von Greenhorn (30. September 2010 um 22:31)

  • BugFix : DIe Option MustDeclareVars bringt zumindest einen Teil dieser Funktionalität. Diese sollte mal standardmäßig aktiviert werden ;)

  • Ich hab das mit der "schädlichen" globalen Deklaration auch nicht verstanden.
    Globala Variablen und Konstanten werden nunmal benötigt.
    Wie hier die Anzahl reinspielen soll? Weil dann können wir uns ja große Skripts gleich sparen, irgendwann ist die minimale Grenze einfach erreicht.
    Das sind wohl Spezialfälle über die Valik da gestolpert ist.

    Innerhalb der Funktion global deklarieren oder mitten im Skript weil man gerade eine Variable braucht ist schlechter Stil, aber wer macht das schon? ;)
    Globale Variablen in den UDF's sind auch zu vermeiden, da man sonst Gefahr läuft den gleichen Namen im Hauptskript nochmal zu verwenden.
    Wieso kommt hier eigentlich keine Warnung wie bei den Konstanten?

    Static ist auch ganz nett. Hat zwar am anfang etwas gedauert, aber mittlerweile setzte ich das auch ein.

  • Am Anfang gab es Probleme mit Arrays, die als statische Variable deklariert wurden. Genauer, bei der Benutzung von ReDim mit einer statischen Arrayvariable.
    Ob der Fehler inzwischen behoben wurde weiss ich nicht, aber könnte gut sein.


    Als ich es das letzte mal getestet habe jedenfalls nicht. Ich erinnere mich aber, dass es da einen einfachen Workaround gab: Man musste den Array nur in eine andere Local Variable kopieren, die Änderungen durchführen und "zurückschreiben". klappt Wunderbar.

  • Zitat von BugFix

    Früher (seeehr viel früher ), 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.

    Back to the Roots!..made my Day^^.
    Aber Spass beiseite, ich vermute, genau weil AutoIt NICHT so restriktiv ist, ist es so erfolgreich und beliebt. Man kann, aber man muss nicht! Ich habe mich auch schon dabei erwischt, "einfach mal draufloszuhacken" und nach der Fertigstellung des Scriptes den Programmcode zu "verschönern". Man kann allerdings auch den "Spaghetticode" chaotisch lassen, solange das der Funktion des Programms keinen Abbruch tut.
    Das bleibt glücklicherweise jedem selbst überlassen!
    Ich jedenfalls wünsche mir die Zeiten von TurboPascal oder der (auch in neuerer Zeit) C-Konstrukte nicht zurück. AutoIt-Programm schreiben, F5 drücken, läuft, fertig. Kein Linken, kein Rumhampeln mit Obj-Files uswusf. Das überlasse ich gerne den "Profis", die 24/7 große Softwarebrocken entwickeln müssen. Dort ist professionelles Vorgehen auch bitter nötig, ansonsten läuft dort garnichts.

    Nichtsdestotrotz freue ich mich aber auch, wenn ich von den Profis hier im Forum "schöne" Software sehe...davor ziehe ich meinen Hut und bin ob deren Disziplin, KnowHow und Skill schwer beeindruckt!

    Zitat von nuts

    Globale Variablen in den UDF's.....Wieso kommt hier eigentlich keine Warnung wie bei den Konstanten?

    Wahrscheinlich, weil damit die schon angesprochene Verwaltung von ansonsten massig auftretenden Variablen vermieden werden soll. Wobei du Recht hast, ein optionaler Schalter für die Anzeige diverser Warnungen wäre sicherlich in einigen Fällen sinnvoll. Wobei ich aber auch schon Aussagen aus dem "Profi"-Lager gehört habe, dass aus Zeitgründen seitenlange Warnungen gerne "weggeklickt" werden, hauptsache, das Programm läuft fehlerfrei.....

    Zitat von Greenhorn

    Du kannst in ASM statische Variablen in Funktionen z.B. so implementieren:

    Guter Tip! Vielen Dank dafür. Ich komme wahrscheinlich nie aus dem "Hobby-Programmierer-Status" raus, die ASM-Geschichte hatte mich interessiert, weil ich in den letzten Monaten aufgrund einer OP zwangsruhiggestellt war und ich beim Aufräumen einige "alte" Programmlistings gefunden hatte.
    Ob ich das Thema weiter vertiefe, weiss ich noch nicht genau, der Umzug auf 64Bit-Systeme wird mittelfristig anstehen, und für "Just for Fun" ist 64Bit-Asm doch etwas komlex^^
    Jedenfalls würde ich mich über dein Feedback/Verbesserungsvorschläge bzgl. ASM freuen, einige der "Autodidakten" hier im Forum (so wie ich) würden sicherlich gerne von deinem KnowHow profitieren :thumbup: und müssten nicht stundenlang herumprobieren, bis einem ein Kronleuchter aufgeht 8o

  • Guter Tip! Vielen Dank dafür. Ich komme wahrscheinlich nie aus dem "Hobby-Programmierer-Status" raus, die ASM-Geschichte hatte mich interessiert, weil ich in den letzten Monaten aufgrund einer OP zwangsruhiggestellt war und ich beim Aufräumen einige "alte" Programmlistings gefunden hatte.
    Ob ich das Thema weiter vertiefe, weiss ich noch nicht genau, der Umzug auf 64Bit-Systeme wird mittelfristig anstehen, und für "Just for Fun" ist 64Bit-Asm doch etwas komlex^^
    Jedenfalls würde ich mich über dein Feedback/Verbesserungsvorschläge bzgl. ASM freuen, einige der "Autodidakten" hier im Forum (so wie ich) würden sicherlich gerne von deinem KnowHow profitieren :thumbup: und müssten nicht stundenlang herumprobieren, bis einem ein Kronleuchter aufgeht 8o


    Ich bin auch nur ein Hobby-Programmierer und Autodidakt.

    Mit ASM beschäftige ich mich seit ca. einem Jahr und ich habe eigentlich auch viel zu wenig Zeit dafür.
    64bit Programme in Assembler zu schreiben ist einfacher als 32bit ASM, finde ich.
    In 64bit ASM (MODEL FLAT) gibt es keine Segmente mehr, alles befindet sich im gleichen Segment. ;)

    Dein ASM Tutorium ist prima gemacht, aber aus den Antworten, bzw. den Eigenversuchen der Leute ersehe ich teilweise, dass die Grundlagen noch nicht richtig verstanden wurden. Ein Buch, dass ich jedem Interessierten empfehlen kann ist Assembler - Grundlagen der Programmierung von Joachim Rohde und Marcus Roming.

    Mach weiter so :) und mal sehen ob meine Kenntnisse ausreichend sind um mich positiv einzubringen ... ;)

    EDIT:
    Ich habe letzte Woche Code-Faltung für ASM in Scintilla eingebaut, bisher aber nur für MASM-Syntax. :)
    Vielleicht kannst Du mir ja bei Gelegenheit behilflich sein FASM-Syntax zu integrieren, sollte die Syntax stark von der MASM-Syntax abweichen (bei den Makros ist es jedenfalls so).
    Bisher habe ich Faltung für Makros, Strukturen/Records/Unions, Prozeduren, bedingte Assemblierung und für die (MASM) Pseudo-Direktiven .if/.elseif/.else und .while (.repeat/.until fehlt noch, fällt mir gerade ein).

    Gruß
    Greenhorn


    Einmal editiert, zuletzt von Greenhorn (1. Oktober 2010 um 18:10)

  • Aahh, hat ich mir schon gedacht. Cool. Wo machst du das denn? Weil an manchen Stellen will ich es gerne verbessern.

  • Mal eine kleine Frage.
    Was ist denn der Vorteil einer Static Variable? Oder was ist so toll dran? :)