Variablen Deklaration Unterschiede

  • In AutoIt gibt es 3 Möglichkeiten eine Variable zu deklarieren

    "Local $variable" -> Diese Variable ist nur in der Funktion / Scope gültig
    "Global $variable" -> Diese ist überall gültig
    $variable = 'test' -> Diese ist auch nur in der Funktion / Scope gültig

    Code
    Func test()
        Local $variable = 'test'
       MsgBox(0,0, $variable)
    EndFunc
    
    
    Func test2()
        $variable = 'test2'
        MsgBox(0,0, $variable)
    EndFunc

    Beide Funktion machen genau das selbe...

    Ich arbeite mit einer UDF, welche mir ein DLLStructElement zurück liefert:

    Code
    Func CreateDllStruct()
        Local $lBuffer = DllStructCreate('ptr')
        Local $lDllStruct = DllStructCreate('long id;long aId;byte unknown1[4];ptr bag;ptr modstruct;long modstructsize;ptr customized;byte unknown2[4];byte type;byte unknown3;short eId;short value;byte unknown4[2];short interaction;long m;ptr modString;byte unknown5[4];ptr NameString;byte unknown6[15];byte q;byte e;byte unknown7[1];byte slot')
    
    
        DllCall($mKernelHandle, 'int', 'ReadProcessMemory', 'int', $mGWProcHandle, 'int', DllStructGetData(1, 'Array') + 4 * ($aSlot - 1), 'ptr', DllStructGetPtr($lBuffer), 'int', DllStructGetSize($lBuffer), 'int', '')
        DllCall($mKernelHandle, 'int', 'ReadProcessMemory', 'int', $mGWProcHandle, 'int', DllStructGetData($lBuffer, 1), 'ptr', DllStructGetPtr($lDllStruct), 'int', DllStructGetSize($lDllStruct), 'int', '')
        Return $lDllStruct
    EndFunc

    Wenn ich in der Func TestDllStruct, die Rückgabe von CreateDllStruct in eine Variable speicher, stürtzt mir das Programm ohne Fehlermeldung ab. Wenn ich allerdings die Variable mit "Local" vorher definiere funktioniert alles ohne probleme.

    Wenn ich das ganze ohne ein "Local $lStruct" bearbeite siehe unteres Test2() beispiel, stürzt mir das Programm auf bzw. kann keine Werte durch DllStructGetData laden.

    Allerdings dürfte es doch zwischen

    Code
    Func Test()
       Local $lStruct
    
    
       $lStruct = CreateDllStruct()
    EndFunc

    und

    Code
    Func Test2()
        $lStruct = CreateDllStruct()
    EndFunc


    keinen direkten Unterschied geben oder?

    Kann mir das Verhalten jmd. erkären? :D

    _
    haendler

    Einmal editiert, zuletzt von haendler (20. Juni 2017 um 11:18)

  • Hi,

    es gibt durchaus einen gewaltigen unterschied zwischen

    Local $var = ...
    und
    $var = ...

    Bei ersterem erzwingst du dass eine neue Variable erstellt wird, bei letzterem kann AutoIt auch eine gleichbennante globale Varriable überschreiben. Beide Varrianten dürfen also auf garkeinen fall beliebig vertauscht werden.

    €: Bei Korekter Kennzeichnung globaler Varriablen, sollte es allerings normalerweise zu keinem Fehler führen.

    mfg
    Zeitriss

    Einmal editiert, zuletzt von Zeitriss (20. Juni 2017 um 11:52)

  • Globale Variablen sind teilweise auch etwas problematisch, z.B. wenn man mehrere Skripte zusammenführt und beide teilweise die gleiche Bezeichnung für Globale Vatiablen haben. Dann muss man umständlich umbenennen und schauen, dass nichts mehrfach vorkommt. Abhilfe schafft es grundsätzlich via Local bzw Local Static zu deklarieren und im Notfall eine "Variablenausgabefunktion" die intern LocalStatic nutzt und von überall aus den Zugriff auf die gleiche Variable ermöglicht. Das mag kleinkariert klingen, aber in einigen Fällen kann diese Vorgehensweise eine Menge Arbeit ersparen (im Ausgleich dafür geht etwas Ausführungsgeschwindigkeit drauf, da der Zugriff via GlobalVar schneller ist als voher eine Funktion aufzurufen die einen zur gewünschten Variable weiterleitet, also nicht in inner loops nutzen).

    Ist quasi OT, aber ich wollte es an dieser Stelle loswerden :)

    M