Что в моих функциях и процедурах вызывает переполнение стека? - PullRequest
0 голосов
/ 10 марта 2020

Я пытаюсь добавить свои три функции вместе в процедуру. Функции CalcOilLubeCharges, CalcMiscCharges и CalcFlushCharges. Я получаю предупреждение о потоке стека после попытки вызова функций, складывающих их вместе и устанавливающих их равными переменной.

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

1 Ответ

2 голосов
/ 10 марта 2020

Давайте посмотрим на первую функцию, чтобы увидеть, где она идет не так.

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

В первой строке объявляется функция с именем CalcOilLubeCharges и типом возврата Decimal

В следующих двух строках объявляются константы. Компилятор не знает, что вы будете иметь sh для работы с десятичной дробью (предпочтительно при работе с деньгами), поэтому он принимает Double. Вы можете сказать это, удерживая курсор над Oil и Lube. Чтобы исправить это место через D после числа.

Давайте предположим, что проверено chkOil. Теперь приходит беда.

CalcOilLubeCharges = CInt(CalcOilLubeCharges() + Lube)

Правая сторона присваивания вызывает CalcOilLubeCharges, метод, в котором мы находимся. Возможно, вы ошибочно предположили, что это переменная, но это имя 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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...