Variablendeklaration

  • Hi,

    sagt mal, das war doch früher nie so?!

    Früher gings auch ohne Deklaration, ausser bei Opt("MustDeclareVars",1)?

    Zitat

    C:\Users\***\Desktop\_neu\2_Routine_***.au3 (52) : ==> Variable used without being declared.:
    if $opt = "B" Then
    if ^ ERROR


    Gruß
    x0r

    Simon nörgelt, Simon nervt - aber Simon verbessert die Welt. Glaubt er.

  • Bei dieser Fehlermeldung hast du Opt("MustDeclareVars",1) drin. Wenn die Variable lediglich keinen Wert hätte kommt die Meldung "WARNING: $opt: possibly used before declaration."

    Andy hat mir ein Schnitzel gebacken aber da war ein Raupi drauf und bevor Oscar das Bugfixen konnte kam Alina und gab mir ein AspirinJunkie.

  • Hi chip,

    thx für die Antwort, allerdings hab ich nur:

    [autoit]

    #AutoIt3Wrapper_UseX64=n

    [/autoit]

    als Option drin, kann man das irgendwo als Standard festlegen?

    Denn irgendwie hab ich das sogar bei komplett neu angefangenen Scripten, sogar mit einer simplen MsgBox ohne irgendwas.

    Simon nörgelt, Simon nervt - aber Simon verbessert die Welt. Glaubt er.

  • Mh es gibt zwar den Parameter "-d" den man wenn man "Compile with Options" unter dem Tab "Au3Check" als Paramter angeben kann, aber das sollte sich eigentlich nur beim Compilieren auswirken.

    Andy hat mir ein Schnitzel gebacken aber da war ein Raupi drauf und bevor Oscar das Bugfixen konnte kam Alina und gab mir ein AspirinJunkie.

  • siehst du, und genau DA liegt das Problem, ich scripte in SciTE ohne irgendwelche Optionen und dennoch kommt ständig die Fehlermeldung (und mal ganz unter uns, es nervt wies Tier! ;()

    ist aber schon ne gewisse Zeit lang so. Gut, bei kleineren Sachen nervts jetz weniger, da deklariert man die halt schnell, aber bei Sachen über 50 Zeilen und mehr als 20 Vars isses extrem anstrengend.

    Simon nörgelt, Simon nervt - aber Simon verbessert die Welt. Glaubt er.

  • Kommando zurück bleibt doch nicht drin. Mh dann weiß ich auch nichtmehr weiter :D.

    Andy hat mir ein Schnitzel gebacken aber da war ein Raupi drauf und bevor Oscar das Bugfixen konnte kam Alina und gab mir ein AspirinJunkie.

    • Offizieller Beitrag

    ich fürchte, ich werde bis an mein Lebensende Variablen deklarieren ;(


    Was ist daran schlimm? - Somit wirst du zum sauberen Umgang mit Variablen gezwungen. Du mußt dir also Gedanken machen welche Variablen du wo einsetzen willst, anstatt einfach eine Variable mitten im Skript aus der Luft zu greifen. Bei kurzen Skripten ist das sicher unproblematisch, aber bei längeren Sachen sollte man zwingend alles vorab deklarieren um die Übersicht zu behalten.
    Wenn du nicht extra deklarierst, werden alle Variablen als Global betrachtet - dafür kannst du ein Skript von mir nutzen, das das erledigt: Variablendeklaration automatisiert. Habe das zwar ewig nicht angewendet, sollte aber noch seinen Dienst tun. Da es von 2008 ist, kann es aber gut sein, dass einige (neuere) Konstanten als Variablen interpretiert werden. Müßte das Skript mal angepaßt werden.

  • aber bei längeren Sachen sollte man zwingend alles vorab deklarieren


    genau da liegt das problem... du hast ein längeres script (sagen wir spontan 300 zeilen (teilweise echt komplex)) und willst zum schnelltest ne msgbox ausgeben mit ner nicht deklarierten var, was passiert? aus der fixen idee bzw dem schnellen test wird was längeres, weil du ja die variable deklarieren musst.. die restlichen vars deklarier ich selbstverständlich, grade bei so großen sachen. es ist halt trotzdem nervend, wenn du ne blitzidee hast und die nicht blitzartig umsetzen kannst - weisst was ich meine? :)

    ansonsten, super teil, ich werds mal testen (und korrigieren, wenn meine noobigen fähigkeiten ausreichen :D)

    Simon nörgelt, Simon nervt - aber Simon verbessert die Welt. Glaubt er.

  • Wenn du das Problem nur allgemein mit den MsgBox'en hast, geb ich dir den Tip, die MsgBox Direkt unter die Variable zu setzen,welche du in der MsgBox verwendest.
    Es bringt nicht viel wen du z.b. auf zeile 1 ne msg mit ner variable hast, welche sich auf zeile....50? befindet? Dann ises ganz klar dass SciTe dir sagt, das auf zeile 1 die Variable $xY nicht Deklariert ist.....
    Das selbe gild auch für _ArrayDisplay().

    Greez

  • sagt mal, das war doch früher nie so?!

    Früher gings auch ohne Deklaration, ausser bei Opt("MustDeclareVars",1)?

    Ob eine Warnung oder ein Fehler ausgegeben wird hängt vom Zeitpunkt des Auftretens ab. Das war schon immer so und ist noch so. Dieses fehlerhafte Skript:

    Spoiler anzeigen
    [autoit]

    #include <GUIConstantsEx.au3>
    #include <StaticConstants.au3>

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

    Global $Picleft[31] = [15, 35, 55, 75, 95, 115, 135, 155, 175, 15, 35, 55, 75, 95, 115, 135, 155, 175, 15, 35, 55, 75, 95, 115, 135, 155, 175, 15, 35, 55, 75] ;Ich weiss geht auch anderst :D
    Global $Pictop[31] = [20, 20, 20, 20, 20, 20, 20, 20, 20, 40, 40, 40, 40, 40, 40, 40, 40, 40, 60, 60, 60, 60, 60, 60, 60, 60, 60, 80, 80, 80, 80] ;Dass geht auch anderst :D
    Global $pic[31] = ['1', '23', '4', '5', '6', '7', '8', '9', '10', '11', '12', '13', '14', '15', '16', '17', '18', '19', '20', '21', '22', '23', '24', '25', '26', '27', '28', '29', '30', '31']
    ;~ Global $PicName[31] = [Die 31 namen der smileys]
    Global $Button[31]
    $hGui = GUICreate('Test')
    For $i = 0 To 30
    $Button[$i] = GUICtrlCreateButton($i, 15 + Mod($i, 9) * 20, 20 + Int($i / 9) * 20, 19, 19)
    Next
    For $i = 0 To 30 ;(Original ist es mit UBound($var)-1 welches die grösse 31 hat)
    ;$Pic[$i] = GuiCtrlCreatePic(@ScriptDir & '\Smileys\' & $Picname[$i],$Picleft[$i],$Pictop[$i],20,20)
    $pic[$i] = GUICtrlCreateButton($i, $Picleft[$i], $Pictop[$i] + 100, 20, 20)
    Next
    GUISetState()

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

    Global $oldMsg
    While 1
    $nMsg = GUIGetMsg()
    Switch $nMsg
    Case $GUI_EVENT_CLOSE
    Exit
    Case $pic[0] To $pic[30]
    _Pic($nMsg - $pic[0])
    Case $Button[0] To $Button[30]
    _Button($nMsg - $Button[0])
    EndSwitch
    WEnd

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

    Func _Pic($iID)
    MsgBox(0, "", "Button " & $ID & " wurde gelickt") ;hier ist eigentlich nur ein Buchstabe vergessen mit unterschiedichen Folgen
    EndFunc ;==>_Pic

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

    Func _Button($iID)
    Global $ID = "Test" ;irgendwann einmal deklariert aber vergessen zu entfernen
    MsgBox(0, "", "Button " & $iID & " wurde gelickt")
    EndFunc ;==>_Button

    [/autoit]

    gibt bei jedem Start eine Warnung aus:

    Code
    D:\Programme\AutoIt3\Test\asdfb.au3(38,32) : WARNING: $ID: possibly used before declaration.
    	MsgBox(0, "", "Button " & $ID &
    	~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~^
    D:\Programme\AutoIt3\Test\asdfb.au3 - 0 error(s), 1 warning(s)


    ob dieser Fehler:

    Code
    D:\Programme\AutoIt3\Test\asdfb.au3(33,32) : WARNING: $ID: possibly used before declaration.
    	MsgBox(0, "", "Button " & $ID &
    	~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~^
    D:\Programme\AutoIt3\Test\asdfb.au3 - 0 error(s), 1 warning(s)
    ->12:55:06 AU3Check ended.rc:1
    >Running:(3.3.6.1):D:\Programme\AutoIt3\autoit3.exe "D:\Programme\AutoIt3\Test\asdfb.au3"    
    D:\Programme\AutoIt3\Test\asdfb.au3 (33) : ==> Variable used without being declared.:
    MsgBox(0, "", "Button " & $ID & " wurde gelickt")
    MsgBox(0, "", "Button " & ^ ERROR

    ausgegeben wird und zum Absturz führt oder nur eine fehlerhafte unerwartete Anzeige in der MsgBox von Zeile 33 führt hängt von der Bedienung ab. Du siehst auch Warnungen sollten nicht ignoriert werden.

    mfg autoBert