(lokalem) Array ein globales zuweisen geht nicht?

  • Hallo Gemeinde und Profis,

    kann mir jemand folgendes Verhalten erklären:

    Ich deklarierte ein leeres globales Array $arBase[1]. In einer Funktion erzeugte ich dann mit Stringsplit ein Array ($aArray1) für ein Errorhandling.
    Zunächst hatte ich das $aArray1 ohne Schlüsselwort deklariert.

    Um nun am Ende der Funktion das $aArray1 quasi zu löschen, habe ich diesem das $arBase[1] zugewiesen.

    Nachdem ich später dem $aArray1 das Schlüsselwort Local vorangestellt habe(damit es eben nur in dieser Funktion gilt),
    bekam ich den Fehler "Error: Variable used without being declared." in Zeile 38.

    Kann man einem lokalen Array kein globales zuweisen?

  • Nachdem ich später dem $aArray1 das Schlüsselwort Local vorangestellt habe(damit es eben nur in dieser Funktion gilt),

    Existiert keine Variable mit dem selben Namen in dem darüberliegenden Scope wird immer eine neue mit dem kleinsten Scope erstellt.

    Du brauchst da nicht unbedingt ein Local. Es hilft aber beim Lesen des Codes.

    Dein Skript ist außerdem alles andere als vollständig. Du erzeugst ein Array mit einem Index $arBase greifst aber in Zeile 38 auf den 2. Index zu, obwohl es nur die Größe eins hat.

    Einen anderen Fehler kann ich nicht erkennen.

    Übrigens ist das "löschen" von Variablen nicht notwendig. Wenn du den Scope verlässt, für das sie definiert sind, werden sie automatisch gelöscht, außer es sind statische Variablen.

  • Hallo Alpines,

    danke für deine Erklärung.

    Also das in Zeile 38 ist ein getippter Fehler, sorry . Richtig heisst die Zeile

    Code
    $aArray1 = $arBase

    der Code ist auch nur ein Beispiel um den Sachverhalt zu verdeutlichen;)

    Verstehe ich es richtig, dass ein Array in einer Funktion auch nur dort gilt, vorausgesetzt es existiert
    kein weiteres mit gleichem Namen im Programm, auch ohne das Schlüsselwort Local?


    :?: Aber warum wurde der Fehler ausgegeben nachdem ich, wie in Zeile 26, das Local einfügte? Hast du da eine Idee?

  • Verstehe ich es richtig, dass ein Array in einer Funktion auch nur dort gilt, vorausgesetzt es existiert
    kein weiteres mit gleichem Namen im Programm, auch ohne das Schlüsselwort Local?

    Korrekt. Dadurch wird die Konsistenz von Scopes (Gültigkeitsbereichen) durchgesetzt.

    Wird eine lokale Variable mit dem gleichen Namen einer globalen Variable erzeugt, so ist die globale Variable innerhalb des Scopes nicht mehr ansprechbar. Alle Referenzen in dem Scope (nach der Deklaration versteht sich) richtigen sich auf die lokale Variable.

    :?: Aber warum wurde der Fehler ausgegeben nachdem ich, wie in Zeile 26, das Local einfügte? Hast du da eine Idee?

    Ich kann so leider nur spekulieren, bastel doch bitte ein Skript, dass ich ausführen kann welches den Sachverhalt reproduziert.

    Dein Skript an sicht wird ja keinen Fehler schmeißen, da die Funktion noch nicht einmal aufgerufen wird.

    Der Au3Checker kommt bei einigen Fehlern sehr stark durcheinander und gibt die Fehlermeldungen an den falschen Stellen aus, obwohl die Fehler teilweise komplett woanders liegen.

    Ich hatte das schon oft genug, deshalb kann ich da nicht helfenn wenn ich es nicht reproduzieren kann.

    Das Skript scheint ja ok zu sein.

  • hipfzwirgel :

    Du möchtest doch nur wissen, ob LENOVO oder FUJITSU im VendorString vorkommen, oder ?

    Falls nicht soll eine entsprechende Meldung ausgegeben werden.

    Auf die ganze Array / StringSplit / StringUpper Geschichte kannst Du meiner Meinung nach verzichten.

    Gruß Musashi

    86598-musashi-c64-png

    "Am Anfang wurde das Universum erschaffen. Das machte viele Leute sehr wütend und wurde allenthalben als Schritt in die falsche Richtung angesehen."

    • Offizieller Beitrag

    Dafür braucht man nicht mal RegExp bemühen. Ein einfaches StringInStr reicht:

  • Die Abfrage ob Lenovo oder Fujitsu im String enthalten ist kann man auch direkt in die Abfrage per Where-Klausel einbauen:

    Code
    If ObjGet("winmgmts:").ExecQuery("SELECT Vendor FROM Win32_ComputerSystemProduct WHERE Vendor LIKE '%LENOVO%' OR VENDOR LIKE '%FUJITSU%'", "WQL").Count Then
        MsgBox(0,"", "Hersteller ist Lenovo oder Fujitsu")
    Else
        MsgBox(0,"", "Hersteller ist nicht Lenovo oder Fujitsu")
    EndIf
  • Hallo Alle Miteinander,

    ganz vielen lieben Dank an alle Antworter. Bevor der Chat in Details abgleitet: der oben angegebene Code ist nur zur Verdeutlichung des Sachverhaltes meiner Fragestellung eingefügt worden.

    Aus den Antworten bzgl. der WMI-Abfragen werde ich mir für die Zukunft einiges genauer anschauen, sind aber dankenswerter Weise in diesem Fall etwas zu viel des Guten.

    Mir war lediglich nicht klar, warum sich das globale $arBase-Array sich, dem im Nachhinein als Local deklarierten $aArray1, nicht mehr zuweisen lies und die angegebene Fehlermeldung erzeugte.
    Das "Löschen" des $aArrays hatte ich nur für den Fall der Namensgleichheit eingebaut und damit der Speicherbereich auf jeden Fall nicht weiterverwendet wird. Mit den Erklärungen von
    Alpines ist mir der Sachverhalt einigermaßen klar geworden. Wie gesagt, dafür und für alle anderen Anregungen danke und schönes WE. Thema ist somit erledigt:rock: