[C#] Błąd przy losowaniu - 'System.StackOverflowException';
Ostatnio zmodyfikowano 2014-04-22 19:32
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();
}
}
}
|
|
DejaVu |
» 2014-04-22 16:45:08 StackOverflow = rekurencja działa źle. |
|
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 ;/ |
|
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); . |
|
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 :) )
|
|
« 1 » |