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


Anmelden zum Antworten