首页 > 解决方案 > 我的函数和过程中的什么导致堆栈溢出?

问题描述

我正在尝试将我的三个函数添加到一个过程中。函数是CalcOilLubeChargesCalcMiscChargesCalcFlushCharges。在尝试调用将它们加在一起并将它们设置为变量的函数后,我收到了堆栈溢出警告。

public Class frmTGAutomotie
    '   Function ValidateInputs() As Boolean
    '     Return
    'End Function
    ' Calculate all oil and lubrication charges
    Function CalcOilLubeCharges() As Decimal
        Const Oil = 36.0
        Const Lube = 28.0
        If chkOil.Checked Then
            CalcOilLubeCharges = CInt(CalcOilLubeCharges() + Oil)
        End If
        If chkLube.Checked Then
            CalcOilLubeCharges = CInt(CalcOilLubeCharges() + Lube)
        End If
        Return CalcOilLubeCharges
    End Function
    ' Calculate radiator and transmission flush charges
    Function CalcFlushCharges() As Decimal
        Const Radiator = 50.0
        Const Transmission = 120.0
        If chkRadiator.Checked Then
            CalcFlushCharges = CInt(CalcFlushCharges() + Radiator)
        End If
        If chkTransmission.Checked Then
            CalcFlushCharges = CInt(CalcFlushCharges() + Transmission)
        End If


        Return CalcFlushCharges
    End Function
    ' Calc Misc charges
    Function CalcMiscCharges() As Decimal
        Const Inspection = 36.0
        Const Muffler = 200.0
        Const Rotation = 20.0
        If chkInspection.Checked Then
            CalcMiscCharges = CInt(CalcMiscCharges + Inspection)
        End If
        If chkMuffler.Checked Then
            CalcMiscCharges = CInt(CalcMiscCharges + Muffler)
        End If
        If chkTireRotation.Checked Then
            CalcMiscCharges = CInt(CalcMiscCharges + Rotation)
        End If
        Return CalcMiscCharges
    End Function

    'Calculate and display the total of all charges,
    ' including labor, parts, and services.
    Sub CalculateTotalCharges()

        Dim TotalCharges As Decimal
        TotalCharges = CalcMiscCharges() + CalcOilLubeCharges() + CalcFlushCharges()
        lbTotalFeesOutput.Text = TotalCharges.ToString
    End Sub
    'Clear
    Sub ClearOilLube()
        chkOil.Checked = False
        chkLube.Checked = False

    End Sub
    'Clear
    Sub ClearFlushes()
        chkTransmission.Checked = False
        chkRadiator.Checked = False
    End Sub
    'Clear
    Sub ClearMisc()
        chkInspection.Checked = False
        chkMuffler.Checked = False
        chkTireRotation.Checked = False
    End Sub
    'Clear
    Sub ClearOthers()
        txtPartsDollars.Clear()
        txtLaborMinutes.Clear()
    End Sub


    Private Sub GroupBox2_Enter(sender As Object, e As EventArgs) Handles grpMisc.Enter

    End Sub

    Private Sub Label1_Click(sender As Object, e As EventArgs) Handles lbOilPrice.Click

    End Sub

    Private Sub Label12_Click(sender As Object, e As EventArgs) Handles lbDollarSign4.Click

    End Sub

    Private Sub Label15_Click(sender As Object, e As EventArgs) Handles lbDollarSign7.Click

    End Sub

    Private Sub Form1_Load(sender As Object, e As EventArgs) Handles MyBase.Load

    End Sub

    Private Sub btnExit_Click(sender As Object, e As EventArgs) Handles btnExit.Click
        Me.Close()
    End Sub

    Private Sub btnClear_Click(sender As Object, e As EventArgs) Handles btnClear.Click
        ClearOilLube()
        ClearFlushes()
        ClearMisc()
        ClearOthers()

    End Sub

    Private Sub lbTotalFeesOutput_Click(sender As Object, e As EventArgs) Handles lbTotalFeesOutput.Click


    End Sub

    Private Sub btnCalculate_Click(sender As Object, e As EventArgs) Handles btnCalculate.Click

        CalculateTotalCharges()
    End Sub

    Private Sub txtPartsDollars_TextChanged(sender As Object, e As EventArgs) Handles txtPartsDollars.TextChanged

    End Sub
End Class

标签: vb.netforms

解决方案


让我们看看第一个函数,看看它哪里出错了。

Function CalcOilLubeCharges() As Decimal
      Const Oil = 36.0
      Const Lube = 28.0
      If chkOil.Checked Then
          CalcOilLubeCharges = CInt(CalcOilLubeCharges() + Oil)
      End If

第一行声明了一个函数,名称为 CalcOilLubeCharges,返回类型为 Decimal

接下来的 2 行声明常量。编译器不知道您希望处理 Decimal(在处理金钱时首选),因此它假定 Double。您可以通过将光标悬停在Oil和上来判断这一点Lube。更正这个D数字后的地方。

让我们假设chkOil已检查。现在麻烦来了。

CalcOilLubeCharges = CInt(CalcOilLubeCharges() + Lube)

赋值的右侧调用CalcOilLubeCharges我们所在的方法。您可能错误地认为这是一个变量,但它是 a 的名称Function。这种情况一遍又一遍地发生,直到我们得到堆栈溢出。

要更正此问题,请使用本地声明的变量来保存值。

我还向您展示了一种使用+=.

Function CalcOilLubeCharges() As Decimal
    Const Oil = 36D
    Const Lube = 28D
    Dim LubeOilCharge As Decimal
    If chkOil.Checked Then
        LubeOilCharge += Oil
    End If
    If chkLube.Checked Then
        LubeOilCharge += Lube
    End If
    Return LubeOilCharge
End Function

Function CalcFlushCharges() As Decimal
    Const Radiator = 50D
    Const Transmission = 120D
    Dim Flush As Decimal
    If chkRadiator.Checked Then
        Flush += Radiator
    End If
    If chkTransmission.Checked Then
        Flush += Transmission
    End If
    Return Flush
End Function

Function CalcMiscCharges() As Decimal
    Const Inspection = 36D
    Const Muffler = 200D
    Const Rotation = 20D
    Dim Misc As Decimal
    If chkInspection.Checked Then
        Misc += Inspection
    End If
    If chkMuffler.Checked Then
        Misc += Muffler
    End If
    If chkTireRotation.Checked Then
        Misc += Rotation
    End If
    Return Misc
End Function

Sub CalculateTotalCharges()
    Dim TotalCharges As Decimal
    TotalCharges = CalcMiscCharges() + CalcOilLubeCharges() + CalcFlushCharges()
    lbTotalFeesOutput.Text = TotalCharges.ToString("N2")
End Sub

推荐阅读