Entwickler-Ecke

Basistechnologien - stack overflow exception in rekursiver prozedur


sataan1337 - Do 27.11.08 19:53
Titel: stack overflow exception in rekursiver prozedur
moin ;)

ich bin neu in c# und hab ein kleines problem ;)

ich wollte mir aus spass ein kleines programm basteln dass die größenbegrenzung für integer-werte umgeht

in ein array schreib ich dafür in array[0] den startwert, verändere ihn (in dem fall quadriert), dann überprüfe ich die grösse und schreibe das ergebnis der ganzzahldivision durch 1000000 ins nächst höhere feld und ersetzte den wert in array[0] durchs modulo
(sry im erklären von sowas bin ich ne niete ich häng mal am ende den quellcode an)

zur ausgabe wollte ich mir jetzt ne rekursive prozedur schreiben die mir die werte von array[99] bis array[0] aneinanderkettet - jeweils mit nem leerzeichen dazwischen

wenn ich das ganze jetzt ausführe krieg ich beim ersten aufruf der "ausgabe"-funktion innerhalb der "ausgabe"- funktion diese "stack overflow exception" ;)

vielleicht hat ja einer von euch ne idee was da nich stimmen könnte ;) thx im voraus


C#-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
22:
23:
24:
25:
26:
27:
28:
29:
30:
31:
32:
33:
34:
35:
36:
37:
38:
39:
40:
41:
42:
43:
44:
45:
46:
47:
48:
49:
50:
51:
52:
53:
54:
55:
56:
57:
58:
59:
60:
61:
62:
63:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Diagnostics;

namespace ConsoleApplication3
{
    class Program
    {
        public static void Main(string[] args)
        {
            int max = 100;
            int pos = 0;
            int[] blub = new int[max];
            blub[0] = 1;
            while (1 == 1)
            {
                pos = position(pos, max, blub);
                for (int i = 0; i <= pos; i++)
                {
                    blub[i] = blub[i] + blub[i];
                    if (blub[i] > 999999)
                    {
                        if (i < 99)
                        {
                            blub[i + 1] = blub[i + 1] + (blub[i] / 1000000);
                            blub[i] = blub[i] % 1000000;
                        }
                    }
                }
               /* Console.WriteLine(Convert.ToString(blub[20]) + " " + Convert.ToString(blub[19]) + " " + Convert.ToString(blub[18]) + " " + Convert.ToString(blub[17]) + " " + Convert.ToString(blub[16]) + " " + Convert.ToString(blub[15]) + " " + Convert.ToString(blub[14]) + " " + Convert.ToString(blub[13]) + " " + Convert.ToString(blub[12]) + " " + Convert.ToString(blub[11]) + " " + Convert.ToString(blub[10]) + " " + Convert.ToString(blub[9]) + " " + Convert.ToString(blub[8]) + " " + Convert.ToString(blub[7]) + " " + Convert.ToString(blub[6]) + " " + Convert.ToString(blub[5]) + " " + Convert.ToString(blub[4]) + " " + Convert.ToString(blub[3]) + " " + Convert.ToString(blub[2]) + " " + Convert.ToString(blub[1]) + " " + Convert.ToString(blub[0])); 
*/
        //die alte ausgabe - war zu faul das bis array[99] so zu schreiben ^^
                Console.WriteLine(ausgabe(99, blub));
                System.Threading.Thread.Sleep(50);
            }
        }

        static string ausgabe(int i, int[] blub)
        {
            if (i == 0)
            {
                return (Convert.ToString(blub[i]));
            }
            string sülz = ausgabe(i--, blub);
            string blah = Convert.ToString(blub[i]);
            return (blah + " " + sülz);
        }


        static int position(int pos, int max, int[] blub)
        {
            for (int i = (max - 1); i >= pos; i--)
            {
                if (blub[i] != 0)
                {
                    return (i);
                }
            }
            return (-1);
        }
    }
}


*edit:

habs mal in java probiert da kommt das gleiche ;) also irgendwas muss ich übersehen haben ^^

Moderiert von user profile iconChristian S.: Code- durch C#-Tags ersetzt


Kha - Do 27.11.08 20:24
Titel: Re: stack overflow exception in rekursiver prozedur
user profile iconsataan1337 hat folgendes geschrieben Zum zitierten Posting springen:
(sry im erklären von sowas bin ich ne niete ich häng mal am ende den quellcode an)
Keine Sorge, habs verstanden :D .

Schau dir mal im Debugger nach jedem Rekursionsschritt den Wert von i an und überlege dir nochmal den Unterschied zwischen Präinkrement- (++i) und Postinkrement-Operatoren (i++) ;) .


sataan1337 - Fr 28.11.08 09:09

omg nein ;) ich danke dir ^^