Variable used without being declared - nach dem compilieren

  • Hallo!

    Heute ist Freitag der 13te und der hat es in sich:

    Ich habe mein Programm weitergeschrieben das auch im Interpretermodus so läuft wie es soll. Nach Abschluss habe ich es compiliert und signiert und wenn ich es Aufrufe kommt sogar noch meine GUI und dann die Meldung: "Line 15976 (File 'd:\...\msvpn_monitor.exe'): Error: used without being declared - nach dem compilieren

    Um den Fehler leichter zu finden (dachte ich halt) habe ich in mein Script AutoItSetOption ("MustDeclareVars", 1) eingefügt und alle vergessenen Variablen sorgfälltig deklariert. Mit F5 gibt es keine Probleme, keine Fehlermeldungen in der SciTE-Console - alles Bestens.

    Aber wenn ich es wieder kompiliere kommt der Fehler. Habe ich eine Chance anhand der Line-Number das zu orten? Oder gibt es noch andere Möglichkeiten den Fehler zu finden?

    Werden alle Funktionen (auch die mit Include) "MustDeclareVars" auch gecheckt?

    Wenn ich das Script poste ist es nicht Lauffähig, da die Umgebung (Netzwerkshares und vor allem DNS) nicht verfügbar ist. Macht die Sache jetzt nicht einfacher!

    Bin für jeden Tipp dankbar

    lg

    Racer

  • Hi Racer ,

    nimm doch mal bitte dies am Anfang deines Programmes mit auf:

    AutoIt
    #AutoIt3Wrapper_AU3Check_Parameters=-d -w 1 -w 2 -w 3 -w 4 -w 5 -w 6 -w 7
    #AutoIt3Wrapper_Run_Au3Stripper=y
    #Au3Stripper_Parameters=/sf /sv /mo /rm /rsln

    Vielleicht helfen dir die Au3Stripper Optionen 🤞 .



    Viele Grüße
    Sven

  • Hallo Sven!

    Ja, jetzt kommen auch die Meldungen im SciTE - und wie viele =O

    Alle in meiner eigenen Scriptsammlung die ich includiere - da habe ich jetzt was zu tun!

    Melde mich nach dem WE wieder wenn ich alles ausgebessert habe...

    vielen Danke!

    Racer

  • Dann viel Erfolg und ein angenehmes Wochenende dir 🤝 .

    Viele Grüße
    Sven

  • Hallo!

    Neues von der Errorfront: Nachdem ich alle Meldungen weggebracht habe kommt der Fehler immer noch ;(

    Ich bin jetzt etwas anders vorgegangen um den Fehler mal einzugrenzen: Da ja die GUI angezeigt wird und erst danach die Fehlermeldung kommt, habe ich an an verschiedenen Stellen im Script ein "exit" eingebaut um zu sehen wie weit es läuft. Auch das hat mich nicht wirklich weiter gebracht.

    Durch Zufall oder eher aus Verzweiflung habe ich dann meine Hilfsvariable "$test" auf True gesetzt und das Programm für die Konsolenausgabe kompiliert. Sie da es funktioniert...

    Das steht am Anfang meiner Scripts:

    ;***************************

    Global $test = ""

    Global $timer_on

    Global $pfad = "\Server\Freigabe$\" ;Hauptpfad

    if @Compiled = 1 Then ;Produktion

    AutoItSetOption("TrayAutoPause", 1) ;Keine Pause im Trayicon

    AutoItSetOption("TrayIconHide",1) ;Kein Trayicon

    $test = false

    Else ;Entwicklung

    $test = True

    $timer_on = False ;Timer für einlesen ein/aus

    EndIf

    ;***************************

    Damit unterscheide ich ob ich noch im Scriptmodus bin oder das Programm kompiliert ist und für die Verwendung freigeben (EXE)

    Im Script mache ich oft eine Konsolenausgabe um zu sehen ob die Variablen richtig gesetzt sind, oder Return-Wert korrekt ist....einfach für die Entwicklung

    Beispiel:

    if $ret <> 1 Then ;Kann nicht geöffnet werden

    $_auto_fqdn_timer = 5000

    $fqdn_write = False

    if $test = True Then

    Print ("FQDN-File darf nur gelesen werden")

    print ("$_auto_fqdn_timer: " & $_auto_fqdn_timer)

    EndIf

    Else

    $fqdn_write = True ;Es darf geschrieben werden

    $_auto_fqdn_timer = 1000 ;Timer wird für writer auf 1 Sekunde gestellt

    if $test = True Then

    Print ("FQDN-File geschrieben werden")

    print ("$_auto_fqdn_timer: " & $_auto_fqdn_timer)

    EndIf

    EndIf


    Setzte ich bei @Compiled die Variabel $test = false bekomme ich den Fehler, lasse ich es auf True funktioniert es. Ich habe alles Funktionen und if / Then mit $test kontrolliert ob da nicht was fehlt ....nichts gefunden

    Momentan bin ich froh das ich das Programm fertigstellen kann, aber eine Erklärung dafür habe ich nicht!

    lg

    Racer

  • Wenn du es per F5 startest, müsstest du doch sehen welche Variable nicht deklariert ist.

    Deine Fehlermeldung erscheint mir auch nicht komplett.

    Andernsfalls befürchte ich, ohne ausreichend/den ganzen Code werden wir dem nciht auf die Schliche kommen.

  • Hallo!

    Ja das ist ja mein Problem: Mit F5 läuft alles ohne Probleme, auch alle Variablen sind deklariert, es gibt auch keine Meldung in der Konsole im SciTe das etwas fehlen sollte.

    Den Quellcode kann ich schon posten - ist ja kein Staatsgeheimnis, aber es wird nicht laufen da das Umfeld nicht verfügbar ist (Firmeninterner DNS-Server mit WAPI, Fileserver mit den Daten,....). Ich kann das auch nicht so umstellen das extern funktioniert da es sich um einen Monitorprogramm handelt das eine Serverfarm überwacht.

    Diverse Pfade und HTTPS-Adressen muss ich aus datenschutzrechtlichen Gründen entfernen...

    lg
    Racer

  • Also auch wenn du dein $test auf False setzt? Du hattest geschrieben, das du $test auf TRUE UND Konsolenausgabe gemahct hast, was ist wenn du nur jeweils eins davon machst?

    Nachtrag: Und Initialisiere $test mal mit False und nicht mit ""

    Nachtrag 2: Ich würde zudem immer If $test then anstatt If $test = True then bzw. If not $test then anstatt If $test = False then bevorzugen.

  • Racer, das ist doch ein wirklich schönes, kleines, strukturiertes Programm, und du willst mir allen Ernstes erzählen, dass du nicht innerhalb weniger Minuten mit DEBUG-MESSAGEBOXEN (Scite CTRL-SHIFT-D) die Zeile mit dem declare-Fehler findest?

    Was ich anhand deiner Variablennamen eher vermute, ist ein Fehler beim Aufruf einer Unterfunktion, ggf. auch in einer der UDF, bei der dieser Variablenname gelöscht bzw. mit anderem Typ (array?!) besetzt wird.

    Leider gibt es in Scite im Tools-Menü kein "Add Tracelines" welche Messageboxen statt Konsolenausgaben verwenden.

    Dann musst du diese Debug-Messageboxen per CTRL_SHIFT_D von Hand setzen

    Da ja die GUI angezeigt wird und erst danach die Fehlermeldung kommt, habe ich an an verschiedenen Stellen im Script ein "exit" eingebaut um zu sehen wie weit es läuft. Auch das hat mich nicht wirklich weiter gebracht.

    Wieso? Du kennst doch den Ablauf in deinem Programm am besten?! Setze Debug-Zeilen jeweils vor und hinter die Funktionsaufrufe, wenn du die Funktion die den Fehler wirft dann lokalisiert hast, machst du das Prozedere innerhalb der Funktion weiter....so lange, bis vor der "fehlerhaften" Zeile im Code eine Messagebox erscheint, und wenn du diese dann wegklickst, die Fehlermeldung.

    Btw könntest du auch die Tracelines verwenden und im Script dann global alle "Consolewrite" mit einer eigenen (Log-)Funktion ersetzen, die statt die Zeile in die Konsole in eine Datei schreibt. Dann hast du in der letzten Zeile der log-Datei deinen Fehler :)

  • Oder du machst das per schreiben in eine Logdatei. Wenn das Programm dann abstürzt, hast du ja den letzten Eintrag bis wohin er gekommen ist und kannst dann weiter vorgehen wie von Andy beschrieben. Eine Logdatei hat den Vorteil, das du nicht die ganze Zeit wegklicken musst.

  • Hallo!

    Ja, jetzt habe ich ein neues Problem: Das Problem ist nicht mehr da....

    Ich habe nur die Änderung wie Du sie beschrieben hast durchgeführt und auch den Gegentest und jetzt geht es immer.

    Bitte haltet mich nicht für verrückt, aber was der Unterschied zu gestern ist kann ich nicht sagen (außer das heute der 17.1 ist)

    Trotzdem habe ich was gelernt das mir sehr geholfen hat:

    #AutoIt3Wrapper_AU3Check_Parameters=-d -w 1 -w 2 -w 3 -w 4 -w 5 -w 6 -w 7
    #AutoIt3Wrapper_Run_Au3Stripper=y

    #Au3Stripper_Parameters=/sf /sv /mo /rm /rsln

    sehr wichtig!

    lg

    Racer

  • Freut mich das dir dies geholfen hat Racer 😀 . Bzgl. "was der Unterschied zu gestern ist" kann ich nur zu GIT bei deinem Projekt raten. Dann kannst du zumindest ausschließen, dass du Änderungen gemacht hast, von denen du gar nichts weißt 😅 .

    Viele Grüße
    Sven

  • Bzgl. "was der Unterschied zu gestern ist" kann ich nur zu GIT bei deinem Projekt raten.

    Scite speichert *.bak-files in beliebiger Iterationstiefe ab, einstellbar in Scite-Config (CTRL-1) auf dem ersten Reiter (Backup Strategy)!

  • Hi Andy ,

    auch 'ne Möglichkeit 👍 . Kannte ich noch nicht und führt sicherlich zum gleichem Ziel. Ist für mich persönlich nicht relevant, da ich seit Jahren nur noch mit VSCode arbeite und nicht mit Scite, dennoch Danke für die Ergänzung 🤝 .

    Viele Grüße

    Sven

  • Ich hatte für SciTE noch eine weitere Debug-Möglichkeiten geschaffen:

    BugFix
    8. Juni 2021 um 14:50

    Vielleicht hilft dir das.

  • auch 'ne Möglichkeit 👍 . Kannte ich noch nicht und führt sicherlich zum gleichem Ziel. Ist für mich persönlich nicht relevant, da ich seit Jahren nur noch mit VSCode arbeite und nicht mit Scite, dennoch Danke für die Ergänzung 🤝 .

    Würde mich SEHR stark wundern, wenn ein x-beliebiger Editor (der seinen Namen verdient) das nicht seit Jahren könnte... 8)

    Es soll sogar Editoren geben, welche "intelligent" Backups anlegen (können) =O Wobei ich mich jetzt frage, wieso Scite das nicht kann... :/

    Ein Werkzeug ist eben nur so gut wie die Aufgabe die dazu passt :ironie:.Aber das gehört in den anderen aktuellen Thread :rofl:

  • Racer darf ich dich dazu noch kurz fragen, wen du hier mit "Du" meinst?

    Hallo!

    Ich habe mich auf Deinen Hinweis "Nachtrag 2: Ich würde zudem immer If $test then anstatt If $test = True then bzw. If not $test then anstatt If $test = False then bevorzugen." bezogen.

    Eigentlich sollte es keinen Unterschied machen ob ich "if $test then" oder "if $test = True Then" schreibe, außer das es kürzer ist! Aber wenn was nicht geht und man sich schon die Haare rauft probiert man alles was es gibt - könnte ja doch was dran sein und ja, da beginnt man wieder an den Weihnachstsmann zu glauben, hauptsache es funktioniert :party:

    lg

    Racer

  • Ich hatte für SciTE noch eine weitere Debug-Möglichkeiten geschaffen:

    BugFix
    8. Juni 2021 um 14:50

    Vielleicht hilft dir das.

    Ich bin sicher das ich irgendwann wieder anstehe und bin für jede Hilfe sehr dankbar!

    lg

    Racer

  • Eigentlich sollte es keinen Unterschied machen ob ich "if $test then" oder "if $test = True Then" schreibe, außer das es kürzer ist! Aber wenn was nicht geht und man sich schon die Haare rauft probiert man alles was es gibt - könnte ja doch was dran sein und ja, da beginnt man wieder an den Weihnachstsmann zu glauben, hauptsache es funktioniert :party:

    Jaein, (folgendes ohne Gewähr) man sollte es meinen aber ich meine mich erinnern zu können das es Unterschiede zwischen Windows true/false und AutoIt true/false geben kann, weshalb man mir mal empfohlen hat niemals auf true oder false zu prüfen, sondern immer if X then bzw if not X then zu nutzen.