Autor Beitrag
stugi82
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 33



BeitragVerfasst: Mo 21.07.08 12:24 
Hallo,

ich habe das Problem, dass beim Ausführen meines Programms nach einer gewissen Zeit eine StackOverflowException auftritt:

An unhandled exception of type 'System.StackOverflowException' occurred in DA.exe

Eine Endlosleife hab ich keine eingebaut. Der Code funktioniert bis zu, Überlauf korrekt. Was ich mache: ich öffne eine txt-Datei mit einem StreamReader und durchsuche sie nach bestimmten Strings. Dazu verwende ich fünf verschiedenen Funktionen. Die alle etwa in so aussehen:

ausblenden volle Höhe 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:
using System;
using System.Collections.Generic;
using System.Text;
using System.IO;
using System.Globalization;

namespace DA
{
    public static class ProcessTwo
    {
        #region Fields
        private static StreamReader _streamReader;
        private static string _line;
        private static string _pattern;
        private static string _timestampLine;
        private static double _timestamp;
        private static string _helper;
        //for testing only
        private static int _currentLine;
        #endregion

        #region Methodes       
        public static void Activate(StreamReader streamReader, int lineNum, CultureInfo cultureInfo)
        {
            _streamReader = streamReader;
            _currentLine = lineNum;

            //Console.WriteLine("Process 2");
            _pattern = "#5";
            while (!_streamReader.EndOfStream)
            {
                _currentLine++;
                _line = _streamReader.ReadLine();
                if (_line.Contains("Ref-Time"))
                    _timestampLine = _line;
                if (_line.Contains(_pattern))
                {
                    _helper = _timestampLine.Replace("Ref-Time: """);
                    _helper = _helper.Replace(" us""");
                    _timestamp = System.Convert.ToDouble(_helper, cultureInfo);
                    _helper = null;
                    ValueContainer.SetCurrentFunctionRangeExit(_timestamp);
                    //ValueContainer.PrintFunctionRangeExited();
                    Console.WriteLine(_currentLine);
                    ProcessThree.Activate(_streamReader, _currentLine, cultureInfo);
                }
            }
            Console.WriteLine("Ende");
        }
        #endregion
    }
}


diese Funktionen rufen sich gegenseitig auf und durchsuchen ein ca. 85000 Zeilen langes File. Ca. 22000 Zeilen lang geht das gut. Danach kommt der Overflow. Meine Frage ist nun, warum das geschieht? Und wie ich das verhindern kann.

Moderiert von user profile iconChristian S.: C#-Tags hinzugefügt
Kha
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 3803
Erhaltene Danke: 176

Arch Linux
Python, C, C++ (vim)
BeitragVerfasst: Mo 21.07.08 13:53 
Der Stack ist im Gegensatz zum Heap normalerweise einfach nicht viel größer als (afaik) ein paar MB, deswegen ist bei einer großen Rekursionstiefe (> 10.000) früher oder später Schluss. Ohne den genauen Algorithmus zu kennen, können wir dir aber nicht sagen, ob es eine gute iterative Lösung gibt. Sollte aber gerade bei solchen Problemen fast immer der Fall sein.
stugi82 Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 33



BeitragVerfasst: Di 22.07.08 10:27 
Ja, es war ein Fall einer verschachtelten Rekursion, die ich nicht gleich erkannt habe.