Benutzer mit den meisten Antworten
Array Probleme

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
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
- Als Antwort vorgeschlagen Denniver ReiningMVP, Moderator Donnerstag, 11. Juli 2019 18:04
- Als Antwort markiert Denniver ReiningMVP, Moderator Dienstag, 23. Juli 2019 21:24
-
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.
Ich nehme mal an, da das letzte Argument $sub ist, dass die funktion cb-menu.. den Eintrag selber hinzufügt.
Alle folgenden Zuweisungen überschreiben den Einrag ebenso.
Also kann die Zuweisung dann wohl entfallen.- Als Antwort vorgeschlagen Denniver ReiningMVP, Moderator Donnerstag, 11. Juli 2019 18:04
- Als Antwort markiert Denniver ReiningMVP, Moderator Dienstag, 23. Juli 2019 21:24
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
- Als Antwort vorgeschlagen Denniver ReiningMVP, Moderator Donnerstag, 11. Juli 2019 18:04
- Als Antwort markiert Denniver ReiningMVP, Moderator Dienstag, 23. Juli 2019 21:24
-
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
-
-
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.
Ich nehme mal an, da das letzte Argument $sub ist, dass die funktion cb-menu.. den Eintrag selber hinzufügt.
Alle folgenden Zuweisungen überschreiben den Einrag ebenso.
Also kann die Zuweisung dann wohl entfallen.- Als Antwort vorgeschlagen Denniver ReiningMVP, Moderator Donnerstag, 11. Juli 2019 18:04
- Als Antwort markiert Denniver ReiningMVP, Moderator Dienstag, 23. Juli 2019 21:24