Dafür verwendet man "Dim"!

  • Nabend,

    nachdem man ja immer sagt man soll Local und Global bei der Deklaration verwenden, weiß ich nun endlich wann man Dim u.a. verwenden kann.
    Unzwar hier.

    [autoit]

    #include <Array.au3>

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

    Global $aTest

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

    _ArrayTest($aTest)

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

    _ArrayDisplay($aTest)

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

    Func _ArrayTest(ByRef $_aArray)
    Dim $_aArray[2]
    $_aArray[0] = "Hello"
    $_aArray[1] = "World"
    EndFunc

    [/autoit]


    Wenn man nicht weiß wie groß ein Array sein muss oder man eine Variable hat die evtl. später im Programm als Array genutzt wird oder als normale Variable, kann man es so machen.

  • Ich wünschte ich hätt euer Wissen 8| ...

    Hab so langsam richtig Kopfschmerzen von diesem ganzen Gehirntraining. :S
    Gehirn: Auslastung = 117%

    Gehirn.exe Shutdown t - 30s. :sleeping:

    Wer Rechtschreibfehler findet darf sie behalten. :D

  • Das Skript ergibt für mich überhaupt keinen Sinn. :huh:

    Welchen Zweck verfolgst du damit genau? Du kannst doch einfach gleich den Array deklarieren. Du musst schließlich auch bei deinem Beispiel wissen wie groß der Array wird.

    Sortier nochmal deine Gedanken und beschreib dann mal ganz klar, welchen Nutzen du jetzt in Dim gegenüber Local siehst.

  • Man soll Dim nicht mehr verwenden, weil es als "deprecated" (überholt) markiert ist und irgendwann aus AutoIt verschwindet. Je öfter Du es verwendest, umso mehr Skripte musst Du dann ändern.

  • Zum Beispiel wird es in der SQlite.au3 verwendet.

    [autoit]

    #include <SQLite.au3>
    #include <SQLite.dll.au3>

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

    Global $hQuery, $aRow, $sMsg
    _SQLite_Startup()
    ConsoleWrite("_SQLite_LibVersion=" & _SQLite_LibVersion() & @CRLF)
    _SQLite_Open() ; open :memory: Database
    _SQLite_Exec(-1, "CREATE TABLE aTest (a,b,c);") ; CREATE a Table
    _SQLite_Exec(-1, "INSERT INTO aTest(a,b,c) VALUES ('c','2','World');") ; INSERT Data
    _SQLite_Exec(-1, "INSERT INTO aTest(a,b,c) VALUES ('b','3',' ');") ; INSERT Data
    _SQLite_Exec(-1, "INSERT INTO aTest(a,b,c) VALUES ('a','1','Hello');") ; INSERT Data
    _SQLite_Query(-1, "SELECT c FROM aTest ORDER BY a;", $hQuery) ; the query
    While _SQLite_FetchData($hQuery, $aRow) = $SQLITE_OK
    $sMsg &= $aRow[0]
    WEnd
    _SQLite_Exec(-1, "DROP TABLE aTest;") ; Remove the table
    MsgBox(0, "SQLite", "Get Data using a Query : " & $sMsg)
    _SQLite_Close()
    _SQLite_Shutdown()

    [/autoit]


    Schonmal aufgefallen, dass du am Anfang meistens Global $aRow oder Local $aRow schreibst und nicht Global $aRow[1] oder Local $aRow[1].
    Das liegt daran, dass erst in _SQLite_FetchData die Variable zu einem Array "umgewandelt" wird mit Dim.
    Ich finde das auch einfacher als Global $aRow[1] und dann später ReDim $aRow[..] zumachen. Wie oft musste ich das schon machen, nur weil die Größe des Arrays dynamisch ist.

  • Schonmal aufgefallen, dass du am Anfang meistens Global $aRow oder Local $aRow schreibst und nicht Global $aRow[1] oder Local $aRow[1].

    Einfach weil es guter Stil ist, alle Variablen im Voraus zu deklarieren, zumal das dem Debugging zuträglich ist. Mit Dim hat das nichts zu tun.

    Das liegt daran, dass erst in _SQLite_FetchData die Variable zu einem Array "umgewandelt" wird mit Dim.

    Wobei die Größe wieder bekannt sein muss. Hier wird nichts umgewandelt, bzw. ist das nicht Sinn der Sache. Die vordeklarierte Variable wird jetzt einfach mit Daten befüllt. Kein Bezug zu Dim.

    Ich finde das auch einfacher als Global $aRow[1] und dann später ReDim $aRow[..] zumachen

    Was keinen Unterschied machen würde zu Dim. Trotzdem musst du beim zweiten Schritt die Größe kennen, da ist es egal ob Dim, Local oder Global.

    Wie oft musste ich das schon machen, nur weil die Größe des Arrays dynamisch ist.

    Wie Dim fällt auch dass bald weg, bzw. ist schon "behoben". In der nächsten AutoIt Version braucht ein Array beim Deklarieren kein Bound mehr:

    [autoit]

    aArray[] = [1,2,3,"Hallo",9*3]

    [/autoit]
  • Das Problem bei Dim ist, dass man nicht weiß, ob man eine neue Variable anlegt oder eine alte ändert.
    Deine Funktion kann man auch so schreiben. In diesem Fall ist sehr übersichtlich, dass man ein neues Array erzeugt und dann das alte damit überschreibt.

    [autoit]

    Func _ArrayTest(ByRef $_aArray)
    Local $_aNewArray[2] = ["Hello", "World"]
    $_aArray = $_aNewArray
    EndFunc

    [/autoit]
  • Zitat

    Das Problem bei Dim ist, dass man nicht weiß, ob man eine neue Variable anlegt oder eine alte ändert.


    Stimmt nicht so ganz.... Mit IsDeclared() kann man das durchaus überprüfen... :D

    Zitat

    Man soll Dim nicht mehr verwenden, weil es als "deprecated" (überholt) markiert ist und irgendwann aus AutoIt verschwindet.


    *hust* Die sollten lieber das Schlüsselwort "Global" raus nehmen, dann kann man wenigstens keine Global Variablen in Funktionen deklarieren! *hust*

    Spoiler anzeigen
    [autoit]

    ; IsDeclared: 1 => Variable ist Global deklariert
    ; 0 => Variable ist nicht deklariert
    ; -1 => Variable ist Lokal deklariert

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

    $gVar = 0 ; Globale Variable

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

    _Func()

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

    ConsoleWrite('Script: ' & @CRLF & _
    ' $gVar => ' & IsDeclared('gVar') & @CRLF & _
    ' $lVar => ' & IsDeclared('lVar') & @CRLF & _
    ' $lToo => ' & IsDeclared('lToo') & @CRLF)

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

    Func _Func()
    If Not IsDeclared('gVar') Then $gVar = 0 ; Wenn nicht Global dann Lokal
    Dim $lVar = 0 ; Lokale Variable
    $lToo = 0 ; Ebenfalls Lokal

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

    ConsoleWrite('Function: ' & @CRLF & _
    ' $gVar => ' & IsDeclared('gVar') & @CRLF & _
    ' $lVar => ' & IsDeclared('lVar') & @CRLF & _
    ' $lToo => ' & IsDeclared('lToo') & @CRLF & @CRLF)
    EndFunc

    [/autoit]
  • Habe mich zufällig heute mittag auch mit dem Thema beschäftigt.
    In der Hilfe steht, dass ReDim ein Array neu dimensioniert und die darin enthaltenen Werte erhalten bleiben wenn dies von der Größe her möglich ist. Bei Dim werden die Werte hingegen gelöscht. Genau dies brauche ich für meine Anwendung. Hab's getestet und es funktioniert.
    Aufgrund des hier geschriebenen habe ich jetzt Dim durch Local ersetzt und das funktioniert auch.
    Insofern sollte die Hilfe entsprechend ergänzt werden.

    MfG ThPfund

    "Es könnte alles so einfach sein..."

  • Da gibt es einen Thread im engl. Forum in dem Änderungswünsche geposted werden können.