Panel użytkownika
Nazwa użytkownika:
Hasło:
Nie masz jeszcze konta?

[C#] Błąd przy losowaniu - 'System.StackOverflowException';

Ostatnio zmodyfikowano 2014-04-22 19:32
Autor Wiadomość
mgrD
Temat założony przez niniejszego użytkownika
[C#] Błąd przy losowaniu - 'System.StackOverflowException';
» 2014-04-22 12:31:26
Witam, napisałem sobie program konsolowy, który ma za zadanie otworzyć plik .txt a następnie wyświetlać pytania(losowo) i odpowiedzi, aż do ostatniego pytania. Błąd polega w jakimś "wyjątku" z jakiegoś pliku. Sądzę, że coś źle napisałem i temu podczas działąnia programu wyskakuje błąd. W pliku .txt mam 4 wersy:

Jak masz na imie?;Adam Malysz:Vladimir Putin:Tomek But:Damian Damian
Kiedy sie urodziles?;1889:1992:1991:1990
Czy lubisz kolor zielony?;Tak:Nie:Chyba:Nie wiem
Wiesz, ze jestes fajny?;Nie jestem:Ja jestem:Chyba Ty:Wiem

Program po wyświetleniu trzech[czasem wyświetla wszystkie pytania, ale w częściej się blokuje niż działa dobrze] dowolnych(bez możliwości powtórki) wyłącza/blokuje się:
http://iv.pl/images​/91867839396257869247.jpg


Pytanie po edycji: Kiedy sie urodziles?
Odpowiedzi:
1889
1992
1991
1990

Pytanie po edycji: Wiesz, ze jestes fajny?
Odpowiedzi:
Nie jestem
Ja jestem
Chyba Ty
Wiem

Pytanie po edycji: Jak masz na imie?
Odpowiedzi:
Adam Malysz
Vladimir Putin
Tomek But
Damian Damian


Process is terminated due to StackOverflowException.
I pokazuje się wtedy błąd z VS:
http://iv.pl/images​/09940701840786076530.jpg
+

The thread 0x2b28 has exited with code 259 (0x103).
'ConsoleApplication2.vshost.exe' (CLR v4.0.30319: ConsoleApplication2.vshost.exe): Loaded 'C:\Users\documents\visual studio 2013\Projects\ConsoleApplication2\ConsoleApplication2\bin\Debug\ConsoleApplication2.exe'. Symbols loaded.
An unhandled exception of type 'System.StackOverflowException' occurred in mscorlib.dll

+ wyświetla się coś takiego w VS:
http://iv.pl/images​/95557605843504245330.jpg

Program:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;


namespace ConsoleApplication2
{
    class Program
    {
        static int ilosc_pytan = 4;

        public static int[] id_random_question = new int[ilosc_pytan];
       
        static void Q(string[] tab)
        {
            int test = Los(ilosc_pytan);

            if(id_random_question[test] == 1)
            {
                Q(tab);
            }
            else
            {
                int find = tab[test].IndexOf(";");
                string question = tab[test].Substring(0, find);

                tab[test] = tab[test].Remove(0, find + 1);

                string[] aswer = tab[test].Split(new char[] { ':' }, 4);
                id_random_question[test] = 1;

                System.Console.WriteLine("Pytanie po edycji: " + question);
                System.Console.WriteLine("Odpowiedzi: ");
                foreach (string p in aswer) System.Console.WriteLine(p);

                System.Console.ReadLine();
            }
           
        }
        static int Los(int max)
        {
            Random random = new Random();
            return random.Next(0, max);
        }

        static void Main(string[] args)
        {
           
            int counter = 0;
            string[] questions = new string[7];
           
            System.IO.StreamReader file = new System.IO.StreamReader(@"c:\test.txt");

            while ((questions[counter] = file.ReadLine()) != null) counter++;

            file.Close();

            System.Console.ReadLine();

            for(int g = 0; g < ilosc_pytan; g++) Q(questions);

             System.Console.ReadLine();
        }
    }
}
P-108502
DejaVu
» 2014-04-22 16:45:08
StackOverflow = rekurencja działa źle.
P-108512
mgrD
Temat założony przez niniejszego użytkownika
» 2014-04-22 16:54:41
Można jaśniej? Jakoś z c# jestem od 2/3 dni więc troche średnio wiem co jest źle ;/
P-108513
DejaVu
» 2014-04-22 17:07:34
Język programowania nie ma znaczenia, bo w każdym języku programowania osiągniesz ten sam błąd wykonując nieskończoną rekurencję lub rekurencję, która przekroczy rozmiar stosu. Patrz linijka:
Q(tab);
.
P-108514
mgrD
Temat założony przez niniejszego użytkownika
» 2014-04-22 19:32:20
Rozumiem, że chyba chodzi o metodę, która odwojuje się sama do siebie, zgadza się? Jeśli warunek się spełnia wywołuję metodę z tym samym argumentem - i tak w kółko, aż stos się przepełni, chyba. Czy mógłbym prosić o jakąś radę jak uniknąć owego błędu bo już chyba trochę się zagubiłem?
Chciałbym, by pytania się nie powtarzały.

Tak zmieniając tą funkcje osiągam to, że teraz częściej program działa poprawnie a błąd wyskakuje rzadziej - wcześniej było odwrotnie, lecz wolałbym, by błąd nie wyskakiwał w ogóle : )


Dzięki za pomoc, samemu udało mi się już poprawić program tak, by wszystko śmigało fajnie(zrobiłem sobie losowanie bez powtórzeń w c# wzorując się na tym z kursu c++ z cpp0x :) )
P-108524
« 1 »
  Strona 1 z 1