Laden...

Problem bei Array in einer Klasse

Erstellt von davechu vor 17 Jahren Letzter Beitrag vor 17 Jahren 2.565 Views
D
davechu Themenstarter:in
46 Beiträge seit 2006
vor 17 Jahren
Problem bei Array in einer Klasse

hi

hab jetzt mit c# angefangen und erstmal ein programm für konsole geproggt. hab davor ein bisschen c++ gemacht, deswegen hats gleich oop.

es ist ein kleines menü, wo man auswählen kann, welche windows-applikation gestartet werden soll. ich mach erstmal ein grundgerüst von der menü-klasse, wo in einem 2-dimensionalen array deffiniert wird, welche programme zur verfügung stehen (jeweils name und pfad).

hier mal der komplette code

using System;
using System.Diagnostics;

//Klasse zum Ausgeben des Menüs
class ProgrammeMenue {

  // 2-dimensionales Array für die Applikationen deklarieren 
  private string[] Applikationen = new string[3][];

  private string[] Applikationen[0] = new string[2]{"Editor","notepad.exe"};
  private string[] Applikationen[1] = new string[2]{"Explorer","explorer.exe"};
  private string[] Applikationen[2] = new string[2]{"Registrierungseditor","regedit.exe"};


  private int LetzteAuswahl = 0;
  
  public void Ausgeben()
  {
    Console.WriteLine("---------------------------------------------------------------------------");
    Console.WriteLine("Hallo Welt - Ein Menueprogramm fuer Systemapplikationen *lol*");
    Console.WriteLine("---------------------------------------------------------------------------\n");
    Console.WriteLine("Um eine Systemprogramm zu starten, geben Sie die entsprechende Zahl ein.\n");
    
	Console.WriteLine("<1> Explorer");
    Console.WriteLine("<2> Editor");
    Console.WriteLine("<3> Registrierungseditor");

    Console.Write("\n");

    Console.WriteLine("<0> Beenden");
    
    Console.Write("\n");
  }
  
  public void Eingeben()
  {
    Console.Write("--> Ihre Eingabe: ");
    String Eingabe = Console.ReadLine();
  }
  
  public void Auswaehlen(int AuswahlNr)
  {
    if (AuswahlNr == 0)
    {
      LetzteAuswahl = 0;
    } else {
	
	} 
  }
  
  public int GetLetzteAuswahl()
  {
    return LetzteAuswahl;
  }

    // Process.Start("regedit.exe");
}


public class Test01
{
  public static void Main()
  {
    // Hauptmenü deklarieren als Instanz der Klasse "Menue"
	ProgrammeMenue Hauptmenue = new ProgrammeMenue();
	// 
	bool Hauptmenue_schliessen = false;

    while (!Hauptmenue_schliessen) {
	  Hauptmenue.Ausgeben();
	  Hauptmenue.Eingeben();
	  if (Hauptmenue.GetLetzteAuswahl() == 0)
	  {
	    Hauptmenue_schliessen = true;
	  }
	}

  }
}

es geht aber um die stelle hier:

  // 2-dimensionales Array für die Applikationen deklarieren 
  private string[] Applikationen = new string[3][];

  private string[] Applikationen[0] = new string[2]{"Editor","notepad.exe"};
  private string[] Applikationen[1] = new string[2]{"Explorer","explorer.exe"};
  private string[] Applikationen[2] = new string[2]{"Registrierungseditor","regedit.exe"};

ich komm einfach nicht drauf was ich da falsch gemacht habe!

beim compilieren kommt folgendes:

Microsoft (R) Visual C# .NET Compiler version 7.10.6001.4
for Microsoft (R) .NET Framework version 1.1.4322
Copyright (C) Microsoft Corporation 2001-2002. All rights reserved.

test02.cs(10,33): error CS0650: Syntax error, bad array declarator. To declare a
        managed array the rank specifier precedes the variable's identifier
test02.cs(10,37): error CS1002: ; expected
test02.cs(10,50): error CS1003: Syntax error, ']' expected
test02.cs(11,33): error CS0650: Syntax error, bad array declarator. To declare a
        managed array the rank specifier precedes the variable's identifier
test02.cs(11,37): error CS1002: ; expected
test02.cs(11,50): error CS1003: Syntax error, ']' expected
test02.cs(12,33): error CS0650: Syntax error, bad array declarator. To declare a
        managed array the rank specifier precedes the variable's identifier
test02.cs(12,37): error CS1002: ; expected
test02.cs(12,50): error CS1003: Syntax error, ']' expected

kann mir einer helfen?

danke schonmal!

N
4.644 Beiträge seit 2004
vor 17 Jahren

2 dimensionales Array:

private string[,] Applikationen = new string[3,2];

Zuweisung:

Applikationen[0,0] = "Editor";
Applikationen[0,1] = "notepad.exe";
N
750 Beiträge seit 2004
vor 17 Jahren

hier vielleicht mal gucken??

ich vermute es liegt an der deklaration von deinem 2-dimensionalen array

edit:
na mal wieder to late 🙁

?( wer suchet, der findet auch! :]

D
davechu Themenstarter:in
46 Beiträge seit 2006
vor 17 Jahren

danke an noodles und nils für die antworten, aber es geht leider immer noch nicht.

habs jetzt so:

  private string[,] Applikationen = new string[3,2];

  Applikationen[0,0] = "Editor";
  Applikationen[0,1] = "notepad.exe";

hier nochmal das ganze programm:

using System;
using System.Diagnostics;

//Klasse zum Ausgeben des Menüs
class ProgrammeMenue {

  // 2-dimensionales Array für die Applikationen deklarieren 
  private string[,] Applikationen = new string[3,2];

  Applikationen[0,0] = "Editor";
  Applikationen[0,1] = "notepad.exe";

  private int LetzteAuswahl = 0;
  
  public void Ausgeben()
  {
    Console.WriteLine("---------------------------------------------------------------------------");
    Console.WriteLine("Hallo Welt - Ein Menueprogramm fuer Systemapplikationen *lol*");
    Console.WriteLine("---------------------------------------------------------------------------\n");
    Console.WriteLine("Um eine Systemprogramm zu starten, geben Sie die entsprechende Zahl ein.\n");
    
	Console.WriteLine("<1> Explorer");
    Console.WriteLine("<2> Editor");
    Console.WriteLine("<3> Registrierungseditor");

    Console.Write("\n");

    Console.WriteLine("<0> Beenden");
    
    Console.Write("\n");
  }
  
  public void Eingeben()
  {
    Console.Write("--> Ihre Eingabe: ");
    String Eingabe = Console.ReadLine();
  }
  
  public void Auswaehlen(int AuswahlNr)
  {
    if (AuswahlNr == 0)
    {
      LetzteAuswahl = 0;
    } else {
	
	} 
  }
  
  public int GetLetzteAuswahl()
  {
    return LetzteAuswahl;
  }

    // Process.Start("regedit.exe");
}


public class Test01
{
  public static void Main()
  {
    // Hauptmenü deklarieren als Instanz der Klasse "Menue"
	ProgrammeMenue Hauptmenue = new ProgrammeMenue();
	// 
	bool Hauptmenue_schliessen = false;

    while (!Hauptmenue_schliessen) {
	  Hauptmenue.Ausgeben();
	  Hauptmenue.Eingeben();
	  if (Hauptmenue.GetLetzteAuswahl() == 0)
	  {
	    Hauptmenue_schliessen = true;
	  }
	}

  }
}

die fehlermeldung:


Microsoft (R) Visual C# .NET Compiler version 7.10.6001.4
for Microsoft (R) .NET Framework version 1.1.4322
Copyright (C) Microsoft Corporation 2001-2002. All rights reserved.

test01.cs(16,15): error CS1003: Syntax error, ']' expected
test01.cs(17,15): error CS1003: Syntax error, ']' expected

C:\csharp>

fehlt vielleicht irgendeine using-zeile? oder hat das was mit der klasse zu tun?

3.170 Beiträge seit 2006
vor 17 Jahren

Versuch mal einen Konstruktor für Deine Hauptmenüklasse zu schreiben und das Array erst dort mit Werten zu initialisieren.

class Hauptmenue
{
  private string[,] Applikationen = new string[3,2];

  Hauptmenue(){
    Applikationen[0,0] = "Editor";
    Applikationen[0,1] = "notepad.exe";  
  }
/* usw. */
}

Non quia difficilia sunt, non audemus, sed quia non audemus, difficilia sunt! - Seneca

49.485 Beiträge seit 2005
vor 17 Jahren

Hallo chri,

wenn ich es richtig gesehe habe, hast du Problem im Umgang mit mehrdimesionalen Arrays. Mehrdimsionale Arrays solltest du dir m.E. mal gründlich in einem Buch anschauen (zumal es ja wohl ein reines Syntax-Problem ist).

herbivore

D
davechu Themenstarter:in
46 Beiträge seit 2006
vor 17 Jahren

den array in den konstruktor zu packen hat leider nichts geholfen.

hier nochmal mein jetziger quellcode:

using System;
using System.Diagnostics;

//Klasse zum Ausgeben des Menüs
class ProgrammeMenue {

   string[,] Applikationen = new string[3,2];
    Applikationen[0,0] = "Editor";
    Applikationen[0,1] = "notepad.exe"; 

  private int LetzteAuswahl = 0;
  
  public void Ausgeben()
  {
    Console.WriteLine("---------------------------------------------------------------------------");
    Console.WriteLine("Hallo Welt - Ein Menueprogramm fuer Systemapplikationen *lol*");
    Console.WriteLine("---------------------------------------------------------------------------\n");
    Console.WriteLine("Um eine Systemprogramm zu starten, geben Sie die entsprechende Zahl ein.\n");
    
	Console.WriteLine("<1> Explorer");
    Console.WriteLine("<2> Editor");
    Console.WriteLine("<3> Registrierungseditor");

    Console.Write("\n");

    Console.WriteLine("<0> Beenden");
    
    Console.Write("\n");
  }
  
  public void Eingeben()
  {
    Console.Write("--> Ihre Eingabe: ");
    string Eingabe = Console.ReadLine();
  }
  
  public void Auswaehlen(int AuswahlNr)
  {
    if (AuswahlNr == 0)
    {
      LetzteAuswahl = 0;
    } else {
	
	} 
  }
  
  public int GetLetzteAuswahl()
  {
    return LetzteAuswahl;
  }

    // Process.Start("regedit.exe");
}


public class Test01
{
  public static void Main()
  {
    // Hauptmenü deklarieren als Instanz der Klasse "Menue"
	ProgrammeMenue Hauptmenue = new ProgrammeMenue();
	// 
	bool Hauptmenue_schliessen = false;

    while (!Hauptmenue_schliessen) {
	  Hauptmenue.Ausgeben();
	  Hauptmenue.Eingeben();
	  if (Hauptmenue.GetLetzteAuswahl() == 0)
	  {
	    Hauptmenue_schliessen = true;
	  }
	}

  }
}

und folgende fehlermeldung:


Microsoft (R) Visual C# .NET Compiler version 7.10.6001.4
for Microsoft (R) .NET Framework version 1.1.4322
Copyright (C) Microsoft Corporation 2001-2002. All rights reserved.

test02.cs(8,19): error CS1003: Syntax error, ']' expected
test02.cs(9,19): error CS1003: Syntax error, ']' expected

kann mir jemand sagen welchen (dummen) syntax-fehler ich hier gemacht habe?

49.485 Beiträge seit 2005
vor 17 Jahren

Hallo chri,

die beiden Zeilen stehen direkt innerhalb der Klasse. Sie müssen aber innerhalb einer Methode stehen. Aber das ist genau, was MarsStein schon gesagt hat.

herbiviore

D
davechu Themenstarter:in
46 Beiträge seit 2006
vor 17 Jahren

ja, ich habs ja schon mit dem konstruktor probiert:

  public ProgrammMenue()
  { 
    string[,] Applikationen = new string[3,2];
    Applikationen[0,0] = "Editor";
    Applikationen[0,1] = "notepad.exe"; 
  }

der compiler gibt aber die selbe fehlermeldung aus.. bin schon am verzweifeln X(

3.170 Beiträge seit 2006
vor 17 Jahren

Hier nochmal Dein Code mit dem Konstruktor, bei mir läßt sich das so übersetzen und läuft auch!!

using System;
using System.Diagnostics;

//Klasse zum Ausgeben des Menüs
class ProgrammeMenue {

   string[,] Applikationen = new string[3,2];
   public ProgrammeMenue(){
    Applikationen[0,0] = "Editor";
    Applikationen[0,1] = "notepad.exe"; 
   }

  private int LetzteAuswahl = 0;
  
  public void Ausgeben()
  {
    Console.WriteLine("---------------------------------------------------------------------------");
    Console.WriteLine("Hallo Welt - Ein Menueprogramm fuer Systemapplikationen *lol*");
    Console.WriteLine("---------------------------------------------------------------------------\n");
    Console.WriteLine("Um eine Systemprogramm zu starten, geben Sie die entsprechende Zahl ein.\n");
    
    Console.WriteLine("<1> Explorer");
    Console.WriteLine("<2> Editor");
    Console.WriteLine("<3> Registrierungseditor");

    Console.Write("\n");

    Console.WriteLine("<0> Beenden");
    
    Console.Write("\n");
  }
  
  public void Eingeben()
  {
    Console.Write("--> Ihre Eingabe: ");
    string Eingabe = Console.ReadLine();
  }
  
  public void Auswaehlen(int AuswahlNr)
  {
    if (AuswahlNr == 0)
    {
      LetzteAuswahl = 0;
    } else {
    
    } 
  }
  
  public int GetLetzteAuswahl()
  {
    return LetzteAuswahl;
  }

    // Process.Start("regedit.exe");
}


public class Test01
{
  public static void Main()
  {
    // Hauptmenü deklarieren als Instanz der Klasse "Menue"
    ProgrammeMenue Hauptmenue = new ProgrammeMenue();
    // 
    bool Hauptmenue_schliessen = false;

    while (!Hauptmenue_schliessen) {
      Hauptmenue.Ausgeben();
      Hauptmenue.Eingeben();
      if (Hauptmenue.GetLetzteAuswahl() == 0)
      {
        Hauptmenue_schliessen = true;
      }
    }

  }
}

Non quia difficilia sunt, non audemus, sed quia non audemus, difficilia sunt! - Seneca

D
davechu Themenstarter:in
46 Beiträge seit 2006
vor 17 Jahren

achso, das array wird in der klasse deffiniert und im konstruktor zugewiesen!

wieso muss das bei arrays eigentlich sein? die variable "LetzteAuswahl" wird ja in der klasse selber initialisiert und gleich zugewiesen. und ist das nur bei arrays so?

@ MarsStein: danke!

3.170 Beiträge seit 2006
vor 17 Jahren

Das ist immer dann so, wenn Du eine Variable nicht zusammen mit der Deklaration initialisieren kannst. Wenn Du also im gleichen Aufruf deklarierst und zuweist, geht das auch bei Arrays:


int[] test = new int[]{1,2,3,4};

Wenn die Zuweisung erst nach der Deklaration erfolgt, muss es in einer Methode geschehen.

Non quia difficilia sunt, non audemus, sed quia non audemus, difficilia sunt! - Seneca

D
davechu Themenstarter:in
46 Beiträge seit 2006
vor 17 Jahren

nochmal danke an MarsStein!

das ist echt ein super forum!

ich denke das thema ist damit abgeschlossen.

49.485 Beiträge seit 2005
vor 17 Jahren

Hallo chri,

achso, das array wird in der klasse deffiniert und im konstruktor zugewiesen!

nein! Das Array wird in der Klasse deklariert und zugewiesen, aber der Zugriff auf die Array-Elemente erfolgt im Konstuktor. Unterscheide das Array immer von seinen Elementen. Deshalb habe ich dir ja auch empfohlen ein Buch zu Rate zu ziehen.

herbivore