CSharp Stackoverflowexception



  • Hey kann mir jemand sagen wo mein Logik Fehler liegt bzw. weshalb VisualStudio diese Fehlermeldungen rauswirft?
    Danke im Vorraus 🙂
    Hier der Komplette Quelltext:

    using System;
    using System.Collections.Generic;
    using System.ComponentModel;
    using System.Data;
    using System.Drawing;
    using System.Linq;
    using System.Text;
    using System.Windows.Forms;

    namespace WindowsFormsApplication4
    {
    public partial class Form1 : Form
    {

    long Lottozahl1;
    long Lottozahl2;
    long Lottozahl3;
    long Lottozahl4;
    long Lottozahl5;
    long Lottozahl6;
    long zaehler;
    long RndNr1;
    Random Rnd = new Random();

    public Form1()
    {
    InitializeComponent();

    }

    private void textBox1_TextChanged(object sender, EventArgs e)
    {

    }

    private void Zufallszahlen()
    {

    RndNr1 = Rnd.Next(50);
    label1.Text = Convert.ToString(RndNr1);
    zaehler = zaehler + 1;
    if (Lottozahl1 == RndNr1)
    {
    label1.Text = "Lottozahl gefunden";
    textBox6.Text = Convert.ToString(zaehler);

    }

    else
    {
    Zufallszahlen();

    }

    }

    private void button1_Click(object sender, EventArgs e)
    {
    Lottozahl1 = Convert.ToInt64(textBox1.Text);
    /*Lottozahl2 = Convert.ToInt64(textBox2.Text);
    Lottozahl3 = Convert.ToInt64(textBox3.Text);
    Lottozahl4 = Convert.ToInt64(textBox4.Text);
    Lottozahl5 = Convert.ToInt64(textBox5.Text);
    Lottozahl6 = Convert.ToInt64(textBox6.Text); */
    Zufallszahlen();
    zaehler = 1;

    }

    private void Form1_Load(object sender, EventArgs e)
    {

    }

    private void label1_Click(object sender, EventArgs e)
    {

    }

    private void button2_Click(object sender, EventArgs e)
    {

    }
    }
    }


  • Administrator

    Das nÀchste Mal:
    1. Code Tags benutzen. Wir haben [cs] Tags.
    2. Sag wo die Fehlermeldung auftritt.

    Zum Fehler:
    Deine Abbruchbedingung der rekursiven Funktion unterliegt dem Zufall. Somit hast du auch eine Gewinnchance fĂŒr eine StackOverflowException .

    GrĂŒssli



  • genau hier 😉 : label1.Text = Convert.ToString(RndNr1);



  • und wenn ich die codezeile auskommentiere hier: Application.Run(new Form1());



  • Ich schĂ€tze mal die ErklĂ€rung von Dravere kam nicht ganz an.

    Du hast eine unnötige Rekursion in Deinem Code, die den Stack zum Überlauf bringt. Und zwar die Methode Zufallszahlen betreffend. Verwende fĂŒr sowas Schleifen.



  • Das ist mein Registrierter User 😉
    Welche Schleife wĂŒrdet ihr vorschlagen? (for, while, do while oder foreach?)



  • okay hat funktioniert danke Leute 😃 falls es jemanden interessiert hier der code:

    using System;
    using System.Collections.Generic;
    using System.ComponentModel;
    using System.Data;
    using System.Drawing;
    using System.Linq;
    using System.Text;
    using System.Windows.Forms;
    
    namespace WindowsFormsApplication4
    {
        public partial class Form1 : Form
        {
    
            long Lottozahl1;
            long Lottozahl2;
            long Lottozahl3;
            long Lottozahl4;
            long Lottozahl5;
            long Lottozahl6;
            long zaehler;
            long RndNr1;
            Random Rnd = new Random();
    
            public Form1()
            {
                InitializeComponent();
    
            }
    
            private void textBox1_TextChanged(object sender, EventArgs e)
            {
    
            }
    
            private void Zufallszahlen()
            {
                while (Lottozahl1 != RndNr1)
                {
                    RndNr1 = Rnd.Next(50000);
                    zaehler = zaehler + 1;
                    label1.Text = "Lottozahl gefunden";
                    textBox6.Text = Convert.ToString(zaehler); 
                }
    
            }
    
            private void button1_Click(object sender, EventArgs e)
            {
                Lottozahl1 = Convert.ToInt64(textBox1.Text);
                /*Lottozahl2 = Convert.ToInt64(textBox2.Text);
                Lottozahl3 = Convert.ToInt64(textBox3.Text);
                Lottozahl4 = Convert.ToInt64(textBox4.Text);
                Lottozahl5 = Convert.ToInt64(textBox5.Text);
                Lottozahl6 = Convert.ToInt64(textBox6.Text); */
                RndNr1 = Rnd.Next(50000);
                Zufallszahlen();
                zaehler = 1;
    
            }
    
            private void Form1_Load(object sender, EventArgs e)
            {
    
            }
    
            private void label1_Click(object sender, EventArgs e)
            {
    
            }
    
            private void button2_Click(object sender, EventArgs e)
            {
    
            }
        }
    }
    

  • Administrator

    Das schreit nach einer do-while Schleife:

    do
    {
      RndNr1 = Rnd.Next(50); 
      label1.Text = Convert.ToString(RndNr1); 
      zaehler = zaehler + 1; 
    }
    while(Lottozahl1 != RndNr1);
    
    label1.Text = "Lottozahl gefunden"; 
    textBox6.Text = Convert.ToString(zaehler);
    

    Man merke, dass ich den Code fast 1:1 ĂŒbernommen habe. Die if-Anweisung habe ich weggenommen und die Bedingung negiert.

    Und nur zur VollstÀndigkeit, dass ist immer noch keine so gute Idee:
    1. In der Theorie ist es möglich, dass diese Schleife nie abbricht und du somit eine Endlosschleife erhÀlst.
    2. In der Praxis wird diese Schleife in Null-Komma-Nichts abbrechen. Du willst wahrscheinlich, dass sich die Zahl regelmĂ€ssig im Feld Ă€ndert und es daher so aussieht, als wĂŒrde die Lottozahl gezogen werden. Das wird hier wohl kaum passieren.

    Ich empfehle daher ein etwas anderes vorgehen, welches vielleicht nicht so offensichtlich ist, aber eher den Effekt erzeugt, den du möchtest. WĂ€hle eine zufĂ€llige Anzahl an Zahlen aus einem gewissen Bereich im Voraus aus. FĂŒge dann einen Timer deinem Programm hinzu und ĂŒber den Tick des Timers zeigst du eine Zahl nach der anderen an, welche du im vornherein ausgewĂ€hlt hast. Damit ist garantiert, dass die Sache auch abbricht. Zudem hast du ĂŒber den Timer und den ausgewĂ€hlten Bereich mehr Kontrollmöglichkeiten fĂŒr die Anzeige (z.B. wie lange es geht bis die Zahl gefunden wurde oder wie schnell die angezeigten Zahlen sich abwechseln).

    GrĂŒssli


  • Administrator

    Dein gezeigter Code funktioniert wohl kaum, wie du es möchtest. Der String "Lottozahl gefunden" wird auf der Stelle angezeigt, obwohl es noch nicht der Fall ist. Zudem setzt du den String immer wieder neu, obwohl es unnötig ist.

    Zudem ist auch das allgemeine Design der Klasse, ganz ehrlich gesagt, nicht so optimal. Verwende mehr lokale Variablen. Gib den Klassen, Variablen und Funktionen bessere Namen und probier einheitlich zu sein. Initialisiere Variablen am Anfang und nicht am Ende. Verwende Arrays. Verwende nicht Convert.ToString , sondern direkt ToString von IFormattable und ĂŒbergib allenfalls auch eine CultureInfo .

    GrĂŒssli


Log in to reply