10. november 2014 - 22:59Der 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; }
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.
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.
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.