Probleme mit MustDeclareVars

  • Hallöchen alle ihr jungs und mädchen (;


    vielleicht kann mir jmd helfen:
    Idee Live MultiLanguage Sprachumschaltung
    kleines Extra damit nicht irgendwer an den Sprachen rumfummelt.. encryptchen.


    es ist eigenlich noch nichts ganz fertig darum verzeit mir.. umständliche codingwege ..


    Jz das eigenliche Problem: (FEHLER auf grund von Opt("MustDeclareVars", 1) => bei 0 ist alles okay..)


    der Aufruf :


    Die Function



    Vielen dank Ich hoffe ich hab jetzt auf die schnelle nicht allzuviel vergessen bzw fehler gemacht :thumbsup::thumbsup:
    :)
    ElCoón ;-)

  • hi,


    ich hab mal das ganze zusammen gefügt und wenn ich den Local so

    Local $gui, $1, $2, $3, $4, $5, $6, $__MLUDF_s_ML_FILENAME, $__MLUDF_s_ML_FILEPATH, $__MLUDF_m_USE_PASSWORD, $__MLUDF_v_USE_ENCRYPT_ALG

    bearbeitet hab ging es, ich hab halt dann unten rausbekommen: Decryption error in deiner MsgBox aber das Script funktioniert..:) lol:D

  • Ich bin mir nicht so sicher, ob das sinnvoll ist einfach alle Variablen global zu deklarieren, wenn er denn schon MustDeclareVars benutzt...
    Hast du schon überprüft, ob irgendeine Variable in deiner Funktion, zum Zeitpunkt des Aufrufens, noch nicht deklariert ist? Möglicherweise ist das einfach nur eine seltsame Zeilenangabe von Au3Check

  • * nur die Variablen $___MLUDF_* sind Global bzw Global Statics ... und alle vars im und um die gui sind nur zum test gedacht..


    Ich hab das gefühl dass es in dem funktionsheader liegt... thoretischw erden alle enthaltenen Variablen/Parameter Lokal für diese einzige Funktion deklariert.
    [[ _INIREAD($s_PATH = Default, $f_UseEncryptedINI = Default) ]] aber scheind als würde das must decar nicht reichen ://


    Ich bin mir nicht so sicher, ob das sinnvoll ist einfach alle Variablen global zu deklarieren, wenn er denn schon MustDeclareVars benutzt...
    Hast du schon überprüft, ob irgendeine Variable in deiner Funktion, zum Zeitpunkt des Aufrufens, noch nicht deklariert ist? Möglicherweise ist das einfach nur eine seltsame Zeilenangabe von Au3Check


    Ja generell schon...


    btw der kopf (Steht da so nix beautified o.ä.):


  • Das sollte eigentlich nicht passieren. Die Funktionsdeklaration sollte nicht als Aufruf einer Variable gewertet werden, sondern als Deklaration eine lokalen Variable.
    Das Problem liegt auch gar nicht bei Au3Check, die Fehlermeldung kommt von AutoIt. Ich hab so ein Verhalten bis jetzt nur im Zusammenhang mit DllCallbacks beobachtet. ^^.

  • Das sollte eigentlich nicht passieren. Die Funktionsdeklaration sollte nicht als Aufruf einer Variable gewertet werden, sondern als Deklaration eine lokalen Variable.


    also das ist mir jz ehrlichgesagt nich neu :P aber trotzdem gehn mir so langsam die ideen aus.. ;(

  • Ehrlich gesagt komme ich hier nicht mit, weil nie ein vollständiges Minimalbeispiel vorliegt bei dem man mal das Problem direkt nachvollziehen kann.


    Dennoch werfe ich mal einen Suchbegriff für die AutoIt-Hilfe in den Raum: #forceref

  • OMG!! :party: okay en kolege hats gepackt ^^ schmerzhafter fail... Es ligt dem ganzen wohl ein Fehler in der Struktur der Au3Check, bzw. was sich auch immer um den check des mustdeclar kümmert, vor.


    $a war weiter oben in einem anderes Case bereits deklariert.
    in case $6 aber noch nicht... der check läft drüber und sieht ein local $a in der while loop und alles is gut... bin der compiler bzw interpreter selbst dran geht :cursing::cursing:


    Lösung ;)




    Trotzdem ein Dank an alle die sich ein kopf gemacht haben :thumbup:


    gibts iwo so ne art sphotline für autoit? :D das könnte man ja im nächsten rl fixen :whistling:


    And Now.. Rock'n'Roll :rock::love:

  • Es ligt dem ganzen wohl ein Fehler in der Struktur der Au3Check, bzw. was sich auch immer um das mustdeclar kümmert, vor.


    $a war weiter oben in einem anderes Case bereits deklariert.
    in case $6 aber noch nicht...

    Wenn $a lediglich in einem anderen Case deklariert wird, dann ist das kein Fehler von Au3Check sondern schlicht korrekt.
    Mit MustDeclareVars soll sichergestellt werden, dass Variablen erst nach einer expliziten Deklaration initialisiert werden dürfen.
    Wenn die Deklaration aber in einem Case steht ist die Deklaration in einem anderen Case nicht sichergestellt (weil das Case mit der Deklaration unter Umständen nie aufgerufen wird).
    Die Deklaration muss also außerhalb des Switchs passieren wenn eine Variable Case-Übergreifende verwendet wird. Oder in jedem Case wo sie verwendet wird einzeln.


    Für Fälle in denen die Struktur wirklich mal zu komplex für Au3Check ist, nimmt man hingegen #forceref.


    ... und wegen minimal beispiel... wenn ICH code... kann es keiner lesen und jz den ganzen code aufräumen nur um iwas kleines zu fixen.. nää

    Tja dann ist die Wahrscheinlichkeit, dass dir jemand (wie hier) dabei helfen kann und möchte schlicht deutlich geringer.

  • Wenn $a lediglich in einem anderen Case deklariert wird, dann ist das kein Fehler von Au3Check sondern schlicht korrekt.
    Mit MustDeclareVars soll sichergestellt werden, dass Variablen erst nach einer expliziten Deklaration initialisiert werden dürfen.
    Wenn die Deklaration aber in einem Case steht ist die Deklaration in einem anderen Case nicht sichergestellt (weil das Case mit der Deklaration unter Umständen nie aufgerufen wird).
    Die Deklaration muss also außerhalb des Switchs passieren wenn eine Variable Case-Übergreifende verwendet wird. Oder in jedem Case wo sie verwendet wird einzeln.


    Für Fälle in denen die Struktur wirklich mal zu komplex für Au3Check ist, nimmt man hingegen #forceref.



    stimmt fast... bestimme ich eine lokale in einer func. und code unter ihr weiter meckert mustdecare check auch rum... und sie ist theoretisch definiert... jedoch (praktisch) nicht zwingend (mustdecalre) ...

  • Hier liegen gleich zwei Missverständnisse zu Grunde:

    • Die Deklaration und Definition einer Funktion bedeutet nicht die Ausführung dieser Funktion. Wenn man eine Funktion definiert wird Sie lediglich dem Interpreter namentlich bekannt gemacht und angegeben wo sie steht. Alles was in ihr ausgeführt werden soll wird schlicht erst einmal ignoriert. Erst wenn die Funktion explizit aufgerufen wird, kommt der Code in Ihr zur Ausführung. In AutoIt ist es sogar egal wo die Funktion deklariert wird. Ob vor oder nach einem Aufruf ist egal.
    • Local in einer Funktion bedeutet, dass die damit deklarierte Variable nur innerhalb der Funktion existiert und sichtbar ist. Außerhalb dieser Funktion ist die damit deklarierte Variable nicht sichtbar.


    Aus diesen beiden Gründen ist die Fehlermeldung von Au3Check also vollkommen korrekt.
    Du weist in Zeile 7 einer Variablen namens $Answer einen Wert zu welche in diesem Rahmen nie deklariert wurde.

  • Ich glaube du verstehst da etwas falsch elcojon. Das es einen Fehler gibt ist korrekt!


    Du hast die Variable nur innerhalb der Funktion deklariert, also kennt er diese nach einem EndFunc nicht mehr.


    #Edit: War scheinbar zu langsam für den AspirinJunkie :P

  • zu 1. ja okay hab ich nich ausprobiert aber in c ist das ja so...
    zu 2. ja und genau das gleiche ist bei switch.. switch entscheidet welche "innere Funktion" aufgerufen wird (via wahrheitswert der mittels den cases festgelegt wird) bei select würde ich es ja noch verstehen weil dort mehrere zutreffen können und sie nacheinander abgearbeitet werden aber bei switch? naja.. problem ist jz auf jedenfall bekannt und man weiß jz woran man ist :rolleyes:

  • In C ist das so? Das will ich gerne sehen o.O Ich würde behaupte das ist in C nicht so, da ist alles noch viel strenger ... ich kann mich nicht daran errinnern, dass das in C so sei. Wenn du da ein Beispiel hast darfst du mir das gerne mal zeigen bitte.


    Und verstehe ich dein 2. Punkt korrekt: Du sagst, dass Switch mit Variablen Funktioniert wie eine Funktion, sprich was du dort nutzt, sei danach nicht mehr deklariert?
    Wenn ja, lass dir gesagt sein das ist auch falsch. Bei einem Switch muss die Variable bereits deklariert sein, und somit erübrigt sich der Rest ...

  • In C ist das so? Das will ich gerne sehen o.O Ich würde behaupte das ist in C nicht so, da ist alles noch viel strenger ... ich kann mich nicht daran errinnern, dass das in C so sei. Wenn du da ein Beispiel hast darfst du mir das gerne mal zeigen bitte.


    ... dass man immer UNTER einer function weiter coden muss wenn von dort der aufruf erfolgr ?(


    und zu dem switch.. nein.. aber ohne den davor aufgerufenen case ist das ganze nicht viel mehr... außerdem waren da """""""" ^^

  • zu 1. ja okay hab ich nich ausprobiert aber in c ist das ja so...

    C verhält sich da genauso wie AutoIt auch.
    Folgendes kompiliert in C nicht (Fehlermeldung undeclared identifier müsste kommen):


    zu 2. ja und genau das gleiche ist bei switch.. switch entscheidet welche "innere Funktion" aufgerufen wird (via wahrheitswert der mittels den cases festgelegt wird) bei select würde ich es ja noch verstehen weil dort mehrere zutreffen können und sie nacheinander abgearbeitet werden aber bei switch? naja.. problem ist jz auf jedenfall bekannt und man weiß jz woran man ist

    Wenn du etwas innerhalb von einem Case (egal ob in Switch/Select/If-Else-Endif) deklarierst, ist dessen Deklaration für folgende Codeteile nicht mehr gesichert. Es ist vollkommen logisch und korrekt, dass dabei der Fehler der nicht deklarierten Variable kommt.


    Edit: O.k. dein Vergleich mit C bezog sich auf die Lage der Funktionsdeklaration - das ist dort tatsächlich anders.