Verwendung der nicht zugewiesenen lokalen Variablen "einKiste"



  • static Kiste Eingabe(int kistenNummer)
            { 
                //eine lokale Strukturvariable
                Kiste einKiste;
                //Eingabe und Speicherung der Daten
                //Nur Integerwerte!!
                Console.WriteLine("Geben Sie die Breite der neuen Kiste Nr. {0} in cm ein:\n", kistenNummer);
                einKiste.Breite = zahlTest();
                Console.WriteLine("Geben Sie die Höhe der neuen Kiste Nr. {0} in cm ein:\n", kistenNummer);
                einKiste.Höhe = zahlTest();
                Console.WriteLine("Geben Sie die Länge der neuen Kiste Nr. {0} in cm ein:\n", kistenNummer);
                einKiste.Länge = zahlTest();
    
                return einKiste;        
            }
    

    Hier kommt die Fehlermeldung!! 😞
    Wenn ich Nr auskommentiere Funktionierts:

    struct Kiste
            {
               // public int Nr;
                public int Breite;
                public int Höhe;
                public int Länge;        
            }
    
    //Kisten Nr zuweisen
                for (int i = 0; i < 100; i++)
                {
                  //  aKiste[i].Nr = i + 1;
                    aKiste[i].Breite = 0;
                    aKiste[i].Höhe = 0;
                    aKiste[i].Länge = 0;
                }
    

  • Administrator

    Kiste einKiste = new Kiste();
    //            ^^^^^^^^^^^^^^
    

    Grüssli



  • Ich wollte nur mit einer Strukturvariablen arbeiten

    static void Main(string[] args)
            {
                bool ausgang = false;
                bool OK=false;
                bool suche=false;
    
                //lokales Struktur-Array in Main()
                Kiste[] aKiste = new Kiste[100];
    
                //Kisten Nr zuweisen
                for (int i = 0; i < 100; i++)
                {
                   // aKiste[i].Nr = i + 1;
                    aKiste[i].Breite = 0;
                    aKiste[i].Höhe = 0;
                    aKiste[i].Länge = 0;
                }
    

    das Struktur Array habe ich schon in Main erschaffen!
    Ist mein Vorhaben überhaupt möglich?


  • Administrator

    Du redest wirr, bzw. ich sehe den Zusammenhang zwischen den von dir gezeigtem Code und der Fehlermeldung im Titel nicht. Wie gesagt, du kannst nicht auf die Eigenschaften einer Variable zugreifen, wenn du dieser noch nichts zugewiesen hast. Das ist völlig unabhängig von struct oder class . Die Variable eineKiste im ersten Codeabschnitt des ersten Beitrages, welche auf Zeile 4 erstellt wird, hat keine Zuweisung vor dem Zugriff auf ihre Eigenschaften.

    Ich sehe keinen Zusammenhang zu dieser for -Schleife.

    Und als Empfehlung: Verwende keine Wertetypen, wo man die Eigenschaften verändern kann. Wenn es geht, verwende ausschliesslich nicht veränderbare Wertetypen. Das erspart dir einige Probleme und Verwirrungen in der Zukunft.

    Grüssli



  • Dravere schrieb:

    Du redest wirr, bzw. ich sehe den Zusammenhang zwischen den von dir gezeigtem Code und der Fehlermeldung im Titel nicht. Wie gesagt, du kannst nicht auf die Eigenschaften einer Variable zugreifen, wenn du dieser noch nichts zugewiesen hast. Das ist völlig unabhängig von struct oder class . Die Variable eineKiste im ersten Codeabschnitt des ersten Beitrages, welche auf Zeile 4 erstellt wird, hat keine Zuweisung vor dem Zugriff auf ihre Eigenschaften.

    Ich sehe keinen Zusammenhang zu dieser for -Schleife.

    Und als Empfehlung: Verwende keine Wertetypen, wo man die Eigenschaften verändern kann. Wenn es geht, verwende ausschliesslich nicht veränderbare Wertetypen. Das erspart dir einige Probleme und Verwirrungen in der Zukunft.

    Grüssli

    Mir is aber auch neu das man structs mit new erzeugen muss. Dann liegt die Variable halt auf dem Stack, ist ja jetzt kein Beinbruch oder nicht ?

    public struct Kiste
    {
    	public int Breite;
    }
    
    public sealed class Program
    {
    	public static void Main(string[] args)
    	{
    
    		Kiste k;
    
    		k.Breite = 100;
    
    		Console.ReadKey();
    
    	}
    }
    

    Der Code kompiliert einwandfrei durch.



  • Firefighter schrieb:

    Mir is aber auch neu das man structs mit new erzeugen muss. Dann liegt die Variable halt auf dem Stack, ist ja jetzt kein Beinbruch oder nicht ?

    Das struct in deinem Beispiel liegt auch auf dem Stack, wenn du es mit new erstellst 😉 Aber wo ist dann der Unterschied zur "C++ Schreibweise"? Ganz einfach: Die Member werden nicht automatisch initialisiert, wie das bei der Instanziierung mit new der Fall wäre.
    Wenn du die Zeile k.Breite = 100; entfernst, bekommst du auch eine Fehlermeldung. Erstellst du die Instanz jedoch mit new, ist das kein Problem.



  • GPC schrieb:

    Firefighter schrieb:

    Mir is aber auch neu das man structs mit new erzeugen muss. Dann liegt die Variable halt auf dem Stack, ist ja jetzt kein Beinbruch oder nicht ?

    Das struct in deinem Beispiel liegt auch auf dem Stack, wenn du es mit new erstellst 😉 Aber wo ist dann der Unterschied zur "C++ Schreibweise"? Ganz einfach: Die Member werden nicht automatisch initialisiert, wie das bei der Instanziierung mit new der Fall wäre.
    Wenn du die Zeile k.Breite = 100; entfernst, bekommst du auch eine Fehlermeldung. Erstellst du die Instanz jedoch mit new, ist das kein Problem.

    Du meinst wenn ich es auf nur Kiste k reduziere? Hab ich gerade mal gemacht, kommt nur ne Warnung und der Member Breite wird auf seinen Default-Wert initialisert.



  • Ach jetzt weiss ich was du meinst. Ja ok, dann ist mein Beispiel natuerlich nich das richtige.


Log in to reply