0

データベースでランダムな食品を取得し、これらの食品のカロリーの合計を取得して、必要なカロリーを超えないかどうかを確認するサブがあります。

ほとんどの場合、潜水艦は機能しましたが、このエラーが表示されることもあります。これは私のコードです。ちょっと長いです。

Private Sub lunchgenerate()

        Dim grams As Integer = DSgrams.Tables("grams").Rows(0).Item("grams")
        Dim grams1 As Integer = DSricegrams.Tables("ricegrams").Rows(0).Item("grams")
        Dim grams2 As Integer = DSgrams2.Tables("grams").Rows(0).Item("grams")

        Dim calorieval As Decimal = foodcalories * grams
        Dim calorieval1 As Decimal = ricecalories * grams1
        Dim calorieval2 As Decimal = foodcalories2 * grams2

        Dim carbval As Decimal = foodcarb * grams
        Dim carbval1 As Decimal = ricecarb * grams1
        Dim carbval2 As Decimal = foodcarb2 * grams2

        Dim proteinval As Decimal = foodprotein * grams
        Dim proteinval1 As Decimal = riceprotein * grams1
        Dim proteinval2 As Decimal = foodprotein2 * grams

        Dim fatval As Decimal = foodfat * grams
        Dim fatval1 As Decimal = ricefat * grams1
        Dim fatval2 As Decimal = foodfat2 * grams

        Dim caloriepercent As Decimal = usercalories * 0.5
        Dim mincalories As Decimal = caloriepercent - 300

        Dim proteinpercernt As Decimal = userprotein * 0.5
        Dim minprotein As Decimal = proteinpercernt - 20

        Dim counter As Integer = 0
        Dim counter1 As Integer = 0

        Dim foodcalorietotal As Decimal = calorieval + calorieval1 + calorieval2
        Dim foodproteintotal As Decimal = proteinval + proteinval1 + proteinval2
        Dim carbtotal As Decimal = carbval + carbval1 + carbval2
        Dim foodfattotal As Decimal = fatval + fatval1 + fatval2

        If foodcalorietotal < mincalories Or foodcalorietotal > caloriepercent Then
            counter = 0
        Else
            counter = 1
        End If

        If foodproteintotal < minprotein Or foodproteintotal > proteinpercernt Then
            counter1 = 0
        Else
            counter1 = 1
        End If

        If counter = 1 And counter1 = 1 Then
          'output to the form

        Else

                **lunchgenerate()**

            End If

        End If
End Sub

エラーは、lunchgenerate()サブが再度呼び出されたときだと思います。

しかし、私が言ったことと同じように、ほとんどの場合は機能しましたが、フリーズしてこのエラーが表示され、コードの最初の行が強調表示されることがあります。

        Dim DAlunchcategory As New SqlDataAdapter(lunchquery, CN)
        Dim DSlunchcategory As New DataSet
        DAlunchcategory.Fill(DSlunchcategory, "category_id")
4

1 に答える 1

1

Stack Overflowエラーは、スタックにスペースがない場合に発生します(ローカル変数、パラメーター値、関数の結果、およびその他のいくつかの小さなことに使用されるプロセスメモリの一部)。

多くの場合、このエラーを生成するコードは、無限再帰を実行することによってエラーを生成します。表示したコードが完全なlunchgenerate関数である場合、1であるかcounterどうかにかかわらず、スタック上のスペースが完全に使い果たされて例外がスローされるまで、まったく同じ結果で再度呼び出されます。それを回避するには、いくつかのエスケープロジックが必要です。counter1lunchgenerate

于 2012-11-27T03:12:18.603 に答える