投稿者 トマト  (小学生) 投稿日時 2009/8/27 01:45:07
こんにちは。質問ばかりですいません。

分数のクラスを作っているのですが計算中にStackOverflowExceptionが発生します。
MSDNによると「入れ子のメソッド呼び出しが多すぎて実行スタックがオーバーフローすると、 StackOverflowException 例外がスローされます。」とのことです。
これを回避する方法はありませんか?

コードを載せておきます。

''' <summary>小学校で習うような簡単な数学を集めました。</summary> 
Public Module EasyMath

'中略 

''' <summary>最大公約数を取得します。</summary> 
''' <param name="Int1">1つ目の数字を指定します。</param> 
''' <param name="Int2">2つ目の数字を指定します。</param> 
Public Function GetGCD(ByVal Int1 As IntegerByVal Int2 As IntegerAs Integer
    '小さいほうを探す 
     Dim Mini As Integer = Math.Min(Int1, Int2)
    
    Dim Int1_List As New List(Of Integer)
    Dim OKList As New List(Of Integer)
    Dim inting As Double
    'Int1を確認 
    For i As Integer = 1 To Mini
        inting = Int1 / i
        If Not IsDecimal(inting) Then 
            Int1_List.Add(i)
        End If
    Next
    'Int2を確認 
     For i As Integer = 1 To Mini
         inting = Int2 / i
         If Not IsDecimal(inting) Then
             If Int1_List.Contains(i) Then
                 OKList.Add(i)
             End If
         End If
     Next
     Return OKList(OKList.Count - 1)
End Function

''' <summary>数字が小数か確認します。</summary> 
''' <param name="Nomber">確認する数字を指定します。</param> 
''' <returns>小数ならTrue でないならFalseを返します。</returns> 
<Extension()> Public Function IsDecimal(ByVal Nomber As DecimalAs Boolean
    Dim NomberStr As String = CStr(Nomber)
    For Each c As Char In NomberStr
        If c = "."Then
            Return True
        End If
    Next
    Return False
End Function

''' <summary>分数を表します。</summary> 
''' <remarks>約分は自動で行われます。</remarks> 
<Serializable()> Public Class Fraction
    Implements IConvertible

'中略 

     ''' <summary>約分をします。</summary> 
     Protected Friend Sub Reduce() '計算のメソッドがこのメソッドを実行したときにどこかの行で発生します。 
        Dim gcd = GetGCD(Me.Denominator, Me.Numerator)
        Me.Denominator \= gcd
        Me.Numerator \= gcd
    End Sub

'中略 

End Class
End Module

ちょっと読みにくくなってしまいました。