Avatar billede svarejoergen Nybegynder
10. november 2014 - 22:59 Der er 4 kommentarer og
1 løsning

stack overflow error.

Jeg laver en simulering af et kortspil. Selve logikken gør hvad den skal. Desværre får jeg stack overflow, hvis jeg prøver at simulere mange hænder i træk. Har været inde og læse på wikipedia, men kan ikke se hvad jeg skal gøre for at få det til at virke.


Jeg opretter et instance af min spil klasse fra main. Jeg kalder startspil() metoden i spil klassen. Den kører så det antal spil jeg har sat den til (vha en konstant i spil()). Spillet kalder selv handlinger fra en beslutningstager klasse. Denne bruger en håndfuld double[52][52] + andre arrays, men ikke noget voldsomt. Eftersom den kan overskue et enkelt spil, burde den også kunne administrere mange spil, da runderne er uafhængige.


Tror min fejl består i at jeg har memory leak. Hvis jeg prøver at ændre en metode opstår fejlen bare i en anden metode efter et andet antal runder. Blandt andet kan den opstå i en for mig at se uproblematisk afrundingsmetode i beslutningstager metoden:

    public double afrund(double num,double afrundmed) {
double result = num/afrundmed+afrundmed/2;
result = Math.floor(result);//floor runder ned, round til nærmeste, ceil op
result = result*afrundmed;
return result;
}

Håber der er nogen der kan hjælpe :)
Avatar billede arne_v Ekspert
11. november 2014 - 03:42 #1
stack overflow skyldes tit en uendelig rekursion d.v.s. en metode som bliver ved med at kalde sig selv
Avatar billede svarejoergen Nybegynder
11. november 2014 - 07:33 #2
metoden startspil() kalder sig selv, efter udført handling, indtil konstanten "antal" overstiger det tal jeg sætter den til. Så kan ikke helt forstå hvorfor det virker for små værdier af "antal" (ca. <250). Her ser alt ud til at fungere fint, og programmet udskriver resultat og stopper som det skal.

Jeg vil prøve at lave forskellige ændringer, så vender jeg tilbage. Vil blandt andet prøve at lave en while loop i main istedet for. Hvis jeg jeg siger new spil() for hver runde vil konstanterne vel i stack gå out of scope, og på den måde sætte resurcerne fri i stacken.

Tak for hjælpen indtil videre :)
Avatar billede MADOlsen Forsker
11. november 2014 - 09:29 #3
Jep, du skal have en anden metode til at kalde startspil().

For hver gang metoden kalder sig selv, ryger der jo et ekstra element på call stacken, hvilket, efter X antal gange, giver stack overflow.

Bliver den derimod kaldt fra main-metoden, når den jo at returnere, inden den bliver kaldt igen, og call stacken bliver derfor "tømt" hver gang, hvorved du undgår at få en stack overflow.
Avatar billede svarejoergen Nybegynder
12. november 2014 - 16:06 #4
Tak. Det virker bare :)

Smid et svar fedeko
Avatar billede MADOlsen Forsker
13. november 2014 - 14:36 #5
Det er jeg glad for at høre :-)
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
Kurser inden for grundlæggende programmering

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester