VB Арифметическое переполнение при простом делении и умножении - PullRequest
0 голосов
/ 21 декабря 2018

Я все еще новичок в программировании приложений и пытаюсь создать боевой калькулятор для игры, в которую я играю.Я выполнил большую часть пользовательского ввода и математики, но, достигнув определенной точки, я столкнулся с переполнением, даже после изменения моей переменной на Int64.

Строка Faulty:

    damagedealt1 = dcfleet1hp / darmadahp * armadadmg

Чтобы поместить некоторый контекст, пользователь вводит количество кораблей и тип корабля, и программное обеспечение вычисляет значения из этих входов.Вот строки, связанные с этим кодом:

        'Fleet 1'
        fleet1hp = fleet1hp + fleet1hpboost
        fleet1dmg = fleet1dmg + fleet1dmgboost
        cfleet1hp = fleet1hp * fleet1count
        cfleet1dmg = fleet1dmg * fleet1count
        'D Fleet 1'
        dfleet1hp = dfleet1hp + dfleet1hpboost
        dfleet1dmg = dfleet1dmg + dfleet1dmgboost
        dcfleet1hp = dfleet1hp * dfleet1count
        dcfleet1dmg = dfleet1dmg * dfleet1count
        'Fleet 2'
        fleet2hp = fleet2hp + fleet2hpboost
        fleet2dmg = fleet2dmg + fleet2dmgboost
        cfleet2hp = fleet2hp * fleet2count
        cfleet2dmg = fleet2dmg * fleet2count
        'D Fleet 2'
        dfleet2hp = dfleet2hp + dfleet2hpboost
        dfleet2dmg = dfleet2dmg + dfleet2dmgboost
        dcfleet2hp = dfleet2hp * dfleet2count
        dcfleet2dmg = dfleet2dmg * dfleet2count

        'Text Fields Assignation'

        tfleet1.Text = fleet1type
        tfleet1count.Text = fleet1count
        tfleet1hp.Text = cfleet1hp
        tfleet1dmg.Text = cfleet1dmg

        tfleet2.Text = fleet2type
        tfleet2count.Text = fleet2count
        tfleet2hpp.Text = cfleet2hp
        tfleet2dmg.Text = cfleet2dmg

        'Armada HP Calculations'

        armadahp = cfleet1hp + cfleet2hp
        armadadmg = cfleet1dmg + cfleet2dmg
        darmadadmg = dcfleet1dmg + dcfleet2dmg
        darmadahp = dcfleet1hp + dcfleet2hp

        'Individual Fleet DMG Calculation'
        'Broken Code Here'
        damagedealt1 = dcfleet1hp / darmadahp * armadadmg
        damagedealt2 = dcfleet2hp / darmadahp * armadadmg
        damagetaken1 = cfleet1hp / armadahp * darmadadmg
        damagetaken2 = cfleet2hp / armadahp * darmadadmg

А вот определения переменных:

fleet1hp = A single ship in attacking fleet 1's HP
fleet1dmg = A single ship in attacking  fleet 1's DMG
cfleet1hp = The HP combined of all ships in attacking Fleet 1
cfleet1dmg = The DMG combined of all ships in attacking Fleet 1
(then all the same with a 'd' before variable to denote defending fleets)

armadahp = The total HP of all Fleets of attacker
darmadahp = The total HP of all fleets of defender
damagedealt1 = Would be the total damage taken by a single fleet

Идея в том, что получаемый урон равен hp флота, деленному на всефлот hp умножает входящий урон

Что должна делать эта строка:

damagedealt1 = dcfleet1hp / darmadahp * armadadmg

Но эта строка вызывает

System.OverflowException: 'Произошла арифметическая операцияв переполнении. '

1 Ответ

0 голосов
/ 21 декабря 2018

Комментарии в строке.

'As near as I can make out this is how
'you declared your variable
 Dim darmadahp As Int64
 Dim armadadmg As Int64
 Dim dcfleet1hp As Int64
 Dim damagedealt1 As Decimal
 'Always check for division by zero
 If darmadahp * armadadmg <> 0 Then
     'Option Strict (which should always be on) requires the CDec
     damagedealt1 = CDec(dcfleet1hp / (darmadahp * armadadmg))
End If
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...