Error "undeclared variable", jedoch nur auf manchen PCs

  • Hallo,

    ich habe das Problem, dass mein Autoit Tool auf manchen Rechnern den angehängten Fehler bringt.
    (Error: Variable used without being declared.)

    Komisch finde ich, dass es Line 8474 anzeigt, obwohl mein Script nur gut 400 Lines hat.

    Ich habe es mit

    [autoit]

    Opt("MustDeclareVars", 1)

    [/autoit]

    und

    [autoit]

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

    [/autoit]

    versucht, was mir beim Compilieren und Testen auf dem lokalen Rechner jedoch keinen Fehler bringt.

    Mein Tool compiliere ich mit X86, ohne UPX und mit Icon.

    Ich konnte bis jetzt nicht raus finden weshalb der Fehler wann auftritt. Gibt es da Möglichkeiten das ganze genau nach zu verfolgen?

    Danke!

    Komplettes Script angehängt als Datei.

  • Komisch finde ich, dass es Line 8474 anzeigt, obwohl mein Script nur gut 400 Lines hat.


    Bei der Exe sind ja auch die Includes mit eingebunden,ziehe also die Zeilenanzahl jedes einzelnen Inludes ab und du hast die Stelle welche den Fehler verursacht.

    PS: Wenn andere den Fehler suchen sollen, benötigen sie auch das Skript dafür

    mfg autoBert

  • Bei der Exe sind ja auch die Includes mit eingebunden,ziehe also die Zeilenanzahl jedes einzelnen Inludes ab und du hast die Stelle welche den Fehler verursacht.

    Okay, stimmt ja. Wenn ich aber die Includes von oben her zusammen zähle, ist die Zeile 8474 im Array.au3 Zeile 530.
    Das liegt dann im Kommentarfeld von _ArrayInsert. "; Parameters ....: $avArray - Array to modify"

    Edit: Kann mir denn einer sagen, warum das Script im autoit-Tag nicht richtig formatiert wird?

    Einmal editiert, zuletzt von NuDann (30. Juli 2012 um 13:47)

  • Edit: Kann mir denn einer sagen, warum das Script im autoit-Tag nicht richtig formatiert wird?


    Falscher Browser oder im Editor-Mode anstatt im Quelcode Mode, hänge es aeinfach als Skruot mut an, denn in diesem ustand macht sich sicher niemand daran,

    mfg autoBert

  • Hey,

    Starte mal dein Tool als Script (also nich compiliert), dann siehst du in SciTE im Ausgabefenster (unten) den Error, zb:

    Hey,
    danke, aber das habe ich natürlich selbst auch schon hunderte von Malen gemacht.
    Das Problem ist eben wie gesagt, dass der Fehler bei mir noch nie im uncompiliertem Zustand aufgetreten ist. Nur bei anderen auf dem PC in compilierter Version.

  • Dass der Fehler noch nie im nicht-kompilierten Zustand aufgetreten ist, ist einfach nur Zufall.
    Versuch es mal in Scite mit Strg+F5 auf Fehler zu prüfen... Das zeigt auch die eventuell nicht-deklarierten Variablen.

  • Ich habe in meinem Code ausnahmslos alle Variablen deklariert.
    Wie kann ich denn den Fehler genauer anzeigen lassen?

  • Achte mal genau darauf, wann der Fehler kommt. Du kennst ja dein Script und weißt wan was geschieht.
    Ansonsten schreib nebenbei ein Log mit.

  • Mit diesem Script werden alle Includes eingefügt und das Script so bearbeitet, dass es dem compilierten Script entsprechen sollte.

    So sollte sich der Fehler anhand der Zeilennummer schonmal eingrenzen lassen...

    Spoiler anzeigen
    [autoit]

    _Include(@ScriptDir & "\Script.au3")

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

    Func _Include($sScriptFile, $bUseBetaIncludes = False)
    Local $sScript = ""
    Local $aIncludesDir = _GetIncludesDir($sScriptFile, $bUseBetaIncludes)
    _InsertIncludeFile($sScriptFile, $sScript, $aIncludesDir) ; Rekursives Einfügen

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

    $sScript = StringRegExpReplace($sScript, "(?i)\s*#include-once.*", "") ;#include-once entfernen

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

    $sScript = StringRegExpReplace($sScript, "(?m)^\h+", "")
    $sScript = StringRegExpReplace($sScript, "\v+\v", @CRLF)
    $sScript = StringRegExpReplace($sScript, "\A\s*", "")

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

    $sScript = StringRegExpReplace($sScript, '\b\s*_\s*\n\s*', " ") ; geteilte Zeilen zusammenfügen

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

    Local $hFile = FileOpen(StringTrimRight($sScriptFile, 4) & "_incLUDER.au3", 2)
    FileWrite($hFile, $sScript)
    FileClose($hFile)
    EndFunc ;==>_Include

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

    Func _InsertIncludeFile($sIncludeFile, ByRef $sScript, $aIncludesDir, $sIncluded = '')
    Local $aScript, $sFile, $aTemp, $aInclude
    $sFile = FileRead($sIncludeFile)
    If @error Then Return SetError(1, 0, $sIncluded)
    _RemoveComments($sFile)
    If StringInStr($sFile, "#include-once") And StringInStr($sIncluded, $sIncludeFile) Then ; wurde bereits eingefügt
    Return SetError(1, 0, $sIncluded)
    EndIf
    $aInclude = StringRegExp(@CRLF & $sFile, "(?i)(?:[\r\n]\h*)(\#include\h+.+)", 3)
    $aTemp = StringRegExpReplace(@CRLF & $sFile, "(?i)[\r\n]\h*\#include\h+.+", Chr(2))
    $aScript = StringSplit($aTemp, Chr(2))
    $sIncluded &= $sIncludeFile & ";"
    If Not IsArray($aScript) Or Not IsArray($aInclude) Or UBound($aInclude) <> $aScript[0] - 1 Then
    $sScript &= $sFile
    Return SetError(1, 0, $sIncluded)
    EndIf
    For $i = 1 To $aScript[0] - 1
    $sScript &= $aScript[$i]
    $sIncluded = _InsertIncludeFile(_GetIncludeFile($aInclude[$i - 1], $sIncludeFile, $aIncludesDir), $sScript, $aIncludesDir, $sIncluded)
    Next
    $sScript &= $aScript[$aScript[0]]
    Return $sIncluded
    EndFunc ;==>_InsertIncludeFile

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

    Func _RemoveComments(ByRef $sScript)
    $sScript = StringRegExpReplace($sScript, '(?x)(?:\r?\n?\s*;.*)|' & '((?>"[^"]*")+|' & "(?>'[^']*')+)", "\1") ;entferne ;-Komments
    $sScript = StringRegExpReplace($sScript, '(?i)(?:[\r\n]\s*)(\#ce|\#comments-end)(.*)', '$1') ;manche #ce haben noch Text dahinter
    $sScript = StringRegExpReplace($sScript, '(?x)(?:\r?\n?\s*;.*)|(?s)\r?\n?\s*\#c(?>s|omments-start)(?>(?>"[^"]*")+|' & "(?>'[^']*')+|.)*?\#c(?>e|omments-end)(?-s)|" & '((?>"[^"]*")+|' & "(?>'[^']*')+)", "\1")
    EndFunc ;==>_RemoveComments

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

    Func _GetIncludeFile($sLine, $sLastFile, $aIncludesDir)
    Local $Temp, $sFilename, $sCurrentDir = StringLeft($sLastFile, StringInStr($sLastFile, "\", 0, -1))
    $Temp = StringRegExpReplace($sLine, "(?i)(.*#include\h+)([\<'" & '"].+[\>"' & "'])(.*)", "\2")
    $sFilename = StringStripWS(StringTrimRight(StringTrimLeft($Temp, 1), 1), 3)
    $Temp = StringLeft($Temp, 1)
    Switch $Temp
    Case "'", '"' ; Script, User, Standart
    If FileExists($sCurrentDir & $sFilename) Then Return $sCurrentDir & $sFilename
    For $i = 3 To $aIncludesDir[0]
    If FileExists($aIncludesDir[$i] & "\" & $sFilename) Then Return $aIncludesDir[$i] & "\" & $sFilename
    Next
    If FileExists($aIncludesDir[2] & "\" & $sFilename) Then Return $aIncludesDir[2] & "\" & $sFilename
    Case Else ; Standart, User, Script
    If FileExists($aIncludesDir[2] & "\" & $sFilename) Then Return $aIncludesDir[2] & "\" & $sFilename
    For $i = 3 To $aIncludesDir[0]
    If FileExists($aIncludesDir[$i] & "\" & $sFilename) Then Return $aIncludesDir[$i] & "\" & $sFilename
    Next
    If FileExists($sCurrentDir & $sFilename) Then Return $sCurrentDir & $sFilename
    EndSwitch
    Return $aIncludesDir[1] & "\" & $sFilename
    EndFunc ;==>_GetIncludeFile

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

    Func _GetIncludesDir($sFilename, $bUseBetaIncludes = False)
    Local $aReturn[3], $Temp, $iCnt = 3
    $aReturn[0] = 2
    $aReturn[1] = StringLeft($sFilename, StringInStr($sFilename, "\", 0, -1) - 1)
    Switch $bUseBetaIncludes
    Case 1
    $aReturn[2] = RegRead("HKEY_LOCAL_MACHINE\SOFTWARE\AutoIt v3\AutoIt", 'betaInstallDir')
    If @error Or $aReturn[2] = "" Then $aReturn[2] = RegRead('HKEY_LOCAL_MACHINE\SOFTWARE\Wow6432Node\AutoIt v3\AutoIt', 'betaInstallDir')
    If $aReturn[2] = "" Then
    ConsoleWrite("!ERROR no beta found - continue using standard includes" & @CRLF)
    $bUseBetaIncludes = False
    ContinueCase
    EndIf
    Case Else
    $aReturn[2] = RegRead("HKEY_LOCAL_MACHINE\SOFTWARE\AutoIt v3\AutoIt", "InstallDir")
    If @error Or $aReturn[2] = "" Then $aReturn[2] = RegRead('HKEY_LOCAL_MACHINE\SOFTWARE\Wow6432Node\AutoIt v3\AutoIt', 'InstallDir')
    EndSwitch
    If $aReturn[2] <> "" Then $aReturn[2] &= "\include"
    $Temp = RegRead("HKEY_CURRENT_USER\Software\AutoIt v3\AutoIt", "Include")
    If @error Or StringStripWS($Temp, 8) = "" Then Return $aReturn
    Switch StringInStr($Temp, ";")
    Case False
    ReDim $aReturn[4]
    $aReturn[0] = 3
    $aReturn[3] = $Temp
    Case Else
    $Temp = StringSplit($Temp, ";")
    If @error Or Not IsArray($Temp) Then Return $aReturn
    For $i = 1 To $Temp[0]
    ReDim $aReturn[$iCnt + 1]
    $aReturn[$iCnt] = $Temp[$i]
    $aReturn[0] = $iCnt
    $iCnt += 1
    Next
    EndSwitch
    Return $aReturn
    EndFunc ;==>_GetIncludesDir

    [/autoit]

    E