none
Array Probleme RRS feed

  • Frage

  • Ich möchte mit den beiden Funktionen ein Multiarray erstellen. Die Daten sollen identisch diesem Array sein:

    [Array]$mnu = @(
    	@(0, "Datei", @(
    			@(1, "Öffnen"), @(2, "Speichern"), @(3, "-"), @(4, "Beenden"))
    	),
    	@(5, "Bearbeiten", @(
    			@(6, "Neu"), @(7, "Rückkängig"), @(8, "Wiederhohlen"))
    	),
    	@(9, "Hilfe", @(
    			@(10, "Hilfe"), @(11, "Info"))
    	)
    				)

    Hier meine Funktionen und der Code mit dem ich dieses Array erstellen möchte!

    function cb-menu-submenu-item-add (){
        param(
            [int]$id,
            [string]$name,
            [array]$submenu = @()
    	)
    	
        $submenu += ,@($id,$name)
        return $submenu
    }
    function cb-menu-menu-item-add(){
        param(
            [int]$id,
            [string]$name,
            [array]$submenu,
            [array]$menu = @()
        )
        $menu += ,@($id,$name,$submenu)
        return $menu
    }
    
    $sub = cb-menu-submenu-item-add -id 1 -name "Öffnen" 
    $sub = cb-menu-submenu-item-add -id 2 -name "Speichern" -submenu $sub
    $sub = cb-menu-submenu-item-add -id 3 -name "-" -submenu $sub
    $sub = cb-menu-submenu-item-add -id 4 -name "Beenden" -submenu $sub
    $menu = cb-menu-menu-item-add -id 0 -name "Datei" -submenu $sub 
    
    $sub = cb-menu-submenu-item-add -id 6 -name "Neu"
    $sub = cb-menu-submenu-item-add -id 7 -name "Rückkängig" -submenu $sub
    $sub = cb-menu-submenu-item-add -id 8 -name "Wiederhohlen" -submenu $sub
    $menu = cb-menu-menu-item-add -id 5 -name "Bearbeiten" -submenu $sub -menu $menu
    
    $sub = cb-menu-submenu-item-add -id 10 -name "Hilfe" 
    $sub = cb-menu-submenu-item-add -id 11 -name "Info" -submenu $sub
    $menu = cb-menu-menu-item-add -id 9 -name "Hilfe" -submenu $sub -menu $menu
    
    
    $mnu | out-string > "d:\mnu.txt"
    
    $menu | out-string > "d:\menu.txt"

    Warum ist $mnu <> $menu? Wo ist mein Denkfehler? Oder ....

    Für jede Hilfe bin ich dankbar!

    Christian

    Freitag, 5. Juli 2019 11:11

Antworten

  • Moin,

    Du solltest Dich mit Objekten und Hashtables auseinandersetzen. Diese Konstrukte sind eher für das Speichern dynamisch erzeugter Daten gedacht als Arrays.

    Der Denkfehler ist jedoch, dass Du jeweils vor dem ersten Aufruf einer *-add-Funktion der Variablen nicht sagst, dass sie ein Array ist. Dadurch, dass die Argumente Deiner Funktionen gleichnamig mit den globalen Variablen sind, findet die Initialisierung der globalen Variablen durch das Weglassen von Argumenten in Funktionen noch lange nicht statt.


    Evgenij Smirnov

    http://evgenij.smirnov.de

    Freitag, 5. Juli 2019 11:32
  • Wenn ich mir das so ansehe:

    $sub = @()
    $menu = @()
    Write-Host ($sub -is [array])
    Write-Host ($menu -is [array])
    $sub = cb-menu-submenu-item-add -id 1 -name "Öffnen" -submenu $sub

    zerstörst du mit der Zuweisung zu $sub wieder das Array.
    Alle folgenden Zuweisungen überschreiben den Einrag ebenso.

    Ich nehme mal an, da das letzte Argument $sub ist, dass die funktion cb-menu.. den Eintrag selber hinzufügt.
    Also kann die Zuweisung dann wohl entfallen.
    Dienstag, 9. Juli 2019 13:48

Alle Antworten

  • Moin,

    Du solltest Dich mit Objekten und Hashtables auseinandersetzen. Diese Konstrukte sind eher für das Speichern dynamisch erzeugter Daten gedacht als Arrays.

    Der Denkfehler ist jedoch, dass Du jeweils vor dem ersten Aufruf einer *-add-Funktion der Variablen nicht sagst, dass sie ein Array ist. Dadurch, dass die Argumente Deiner Funktionen gleichnamig mit den globalen Variablen sind, findet die Initialisierung der globalen Variablen durch das Weglassen von Argumenten in Funktionen noch lange nicht statt.


    Evgenij Smirnov

    http://evgenij.smirnov.de

    Freitag, 5. Juli 2019 11:32
  • Hallo,

    vielen Dank für die Antwort! Aber selbst wenn ich ein leres Array der Funktion übergeben, bekomme ich nicht das gewünschte Ergebnis.

    $sub = @()
    $menu = @()
    Write-Host ($sub -is [array])
    Write-Host ($menu -is [array])
    $sub = cb-menu-submenu-item-add -id 1 -name "Öffnen" -submenu $sub
    $sub = cb-menu-submenu-item-add -id 2 -name "Speichern" -submenu $sub
    $sub = cb-menu-submenu-item-add -id 3 -name "-" -submenu $sub
    $sub = cb-menu-submenu-item-add -id 4 -name "Beenden" -submenu $sub
    $menu = cb-menu-menu-item-add -id 0 -name "Datei" -submenu $sub -menu $menu
    
    $sub = cb-menu-submenu-item-add -id 6 -name "Neu"
    $sub = cb-menu-submenu-item-add -id 7 -name "Rückkängig" -submenu $sub
    $sub = cb-menu-submenu-item-add -id 8 -name "Wiederhohlen" -submenu $sub
    $menu = cb-menu-menu-item-add -id 5 -name "Bearbeiten" -submenu $sub -menu $menu
    
    $sub = cb-menu-submenu-item-add -id 10 -name "Hilfe" 
    $sub = cb-menu-submenu-item-add -id 11 -name "Info" -submenu $sub
    $menu = cb-menu-menu-item-add -id 9 -name "Hilfe" -submenu $sub -menu $menu

    Montag, 8. Juli 2019 13:45
  • Moin,

    das einmal zu setzen reicht nicht ;-)


    Evgenij Smirnov

    http://evgenij.smirnov.de

    Montag, 8. Juli 2019 13:49
  • Würdest du mir verraten wie es geht?

    Ich finde die Lösung nicht!

    Gruß

    Christian

    Dienstag, 9. Juli 2019 07:49
  • Wenn ich mir das so ansehe:

    $sub = @()
    $menu = @()
    Write-Host ($sub -is [array])
    Write-Host ($menu -is [array])
    $sub = cb-menu-submenu-item-add -id 1 -name "Öffnen" -submenu $sub

    zerstörst du mit der Zuweisung zu $sub wieder das Array.
    Alle folgenden Zuweisungen überschreiben den Einrag ebenso.

    Ich nehme mal an, da das letzte Argument $sub ist, dass die funktion cb-menu.. den Eintrag selber hinzufügt.
    Also kann die Zuweisung dann wohl entfallen.
    Dienstag, 9. Juli 2019 13:48