2013-02-12 167 views
-2

我正在制作一个程序,它将删除十六进制编辑旧DOS游戏(足球的理智世界)的痛苦。算术运算导致溢出。

该程序将删除您可以购买的玩家数量限制(5),移除您可以竞争的最大季节数(20)。

我试图让它可以编辑您的转帐预算,但我在运行代码时遇到了Arithmetic operation resulted in an overflow.错误选择了5000万选项。

这里是我的程序(转让限制&最大的季节限制都工作)的完整代码:

Imports System.IO 

Public Class Swos_Editor_2013 

    Dim transferbudget As String 

    Private Sub OpenToolStripMenuItem_Click(sender As Object, e As EventArgs) Handles OpenToolStripMenuItem.Click 
    '######### 
    '#WARNING# 
    '######### 
    'Dim answer As DialogResult 
    'answer = MessageBox.Show("Make a Backup of your career file then click OK to proceed. I take no responsibility for damaged career files", 
    '        "*PLEASE READ BEFORE PROCEEDING*", MessageBoxButtons.OK, MessageBoxIcon.Asterisk) 


    '########################## 
    '#Progress bar set options# 
    '########################## 
    ProgressBar1.Minimum = 0 
    ProgressBar1.Maximum = 2 
    ProgressBar1.Value = 0 


    '################## 
    '#tool tip options# 
    '################## 
    Dim toolTip1 As New ToolTip 


    toolTip1.AutoPopDelay = 5000 
    toolTip1.InitialDelay = 1000 
    toolTip1.ReshowDelay = 500 
    ToolTip1.ShowAlways = True 


    '################################### 
    '#Open Swos career file for editing# 
    '################################### 
    Me.OpenFileDialog1.InitialDirectory = "c:\" 
    Me.OpenFileDialog1.Title = "Select Career File for editing" 
    Me.OpenFileDialog1.DefaultExt = "*.car" 
    Me.OpenFileDialog1.FileName = "" 
    Me.OpenFileDialog1.Filter = "Career File(*.car)|*.car" 
    Me.OpenFileDialog1.Multiselect = False 


    '################### 
    '#OK button pressed# 
    '################### 
    If Me.OpenFileDialog1.ShowDialog() = Windows.Forms.DialogResult.OK Then 


     '############################## 
     '#increase progress bar to 50%# 
     '############################## 


     If ProgressBar1.Value < ProgressBar1.Maximum Then 
      ProgressBar1.Value += 1 
     End If 


     '################ 
     '#Enable buttons# 
     '################ 


     btn_save.Enabled = True 
     btn_trans_limit.Enabled = True 
     btn_career_limit.Enabled = True 
     cb_combo.Enabled = True 
    End If 
End Sub 
'####################### 
'#Enable combo box drop# 
'####################### 
Private Sub cb_combo_CheckedChanged(ByVal sender As Object, e As EventArgs) Handles cb_combo.CheckedChanged 
    ComboBox1.Enabled = True 
End Sub 
'######################## 
'#Select Transfer Budget# 
'######################## 
Private Sub ComboBox1_DropDownClosed(ByVal sender As Object, e As EventArgs) Handles ComboBox1.DropDownClosed 


    Select Case ComboBox1.SelectedItem 
     Case Is = "-£10 million (are you crazy CHALLENGE)" 
      transferbudget = "100" 
     Case Is = "-£2 million (mid level CHALLENGE)" 
      transferbudget = "200" 
     Case Is = "-£500k (lower league CHALLENGE)" 
      transferbudget = "500" 
     Case Is = "£500k (tough)" 
      transferbudget = "05" 
     Case Is = "£5 million" 
      transferbudget = "5" 
     Case Is = "£10 million" 
      transferbudget = "10" 
     Case Is = "£25 million" 
      transferbudget = "25" 
     Case Is = "£50 million" 
      transferbudget = "50000000" 
     Case Is = "£99 million" 
      transferbudget = "999"       
    End Select 
End Sub 
'####################################### 
'#exit if EXIT is clicked from dropdown# 
'####################################### 
Private Sub ExitToolStripMenuItem_Click(sender As Object, e As EventArgs) Handles ExitToolStripMenuItem.Click 
    Me.Close() 
End Sub 
'####################### 
'#Not got a bloody clue# 
'####################### 
Private Shared Function InlineAssignHelper(Of T)(ByRef target As T, value As T) As T 
    target = value 
    Return value 
End Function 
'################################################################## 
'#Apply changes made to drop down box AND radio button IF selected# 
'################################################################## 
Public Sub SaveChanges() 
    Dim amount As Integer 
    Dim fpath As String = OpenFileDialog1.FileName 


    Using stream = New FileStream(fpath, FileMode.Open, FileAccess.ReadWrite) 
     Dim result As Integer = 0 
     Dim buffer As Byte() = New Byte(3) {} 


     stream.Position = 54748 
     If (stream.Read(buffer, 0, 4) <> 4) Then 
      Throw New Exception(("Didn't read 4 bytes when it should have: " _ 
          + (result + "bytes read"))) 
     End If 


     stream.Position = &HD5DC 


     buffer = BitConverter.GetBytes(amount) 


     stream.Write(buffer, 0, 4) 
     stream.Position = &HD880 
     If btn_career_limit.Checked Then 
      stream.WriteByte(0) 
     Else 
      stream.WriteByte(1) 
     End If 


     stream.Position = &HD5C4 
     If btn_trans_limit.Checked Then 
      stream.WriteByte(&HFF) 
     Else 
      stream.WriteByte(0) 
     End If 


     'stream.Write(buffer, 0, 4) 
     'stream.Position = &HD5DC 
     'If testbutton.Checked Then 
     ' stream.WriteByte("3B9AC9FF") 
     'End If 


     **If cb_combo.Checked = True Then 
      stream.Position = &HD5DC 
      stream.WriteByte(transferbudget) ######this is where i get the overflow error#####** 
     End If 
    End Using 
End Sub 
'############################################### 
'#Save above changes & set progress bar to 100%# 
'############################################### 


Private Sub btn_save_Click(sender As Object, e As EventArgs) Handles btn_save.Click 
    SaveChanges() 


    If ProgressBar1.Value < ProgressBar1.Maximum Then 
     ProgressBar1.Value += 1 
    End If 
End Sub 
'######################################################################################################################################### 
'#                TOOL TIP (MOUSE HOVER)             # 
'#                                  # 
Private Sub btn_trans_limit_CheckedChanged(sender As Object, e As EventArgs) Handles btn_trans_limit.MouseHover 
    '# 
    ToolTip1.SetToolTip(btn_trans_limit, "Removes 5 player transfer limit")                '# 
End Sub 
Private Sub btn_career_limit_CheckedChanged(sender As Object, e As EventArgs) Handles btn_career_limit.MouseHover      '# 
    '#                                 '# 
    ToolTip1.SetToolTip(btn_career_limit, "Removes 20 season limit")                 '# 
End Sub 
Private Sub ComboBox1_MouseHover(sender As Object, e As EventArgs) Handles ComboBox1.MouseHover           '# 
    '#                                 '# 
    ToolTip1.SetToolTip(ComboBox1, "Select Transfer Budget")                   '# 
End Sub 
Private Sub btn_save_MouseHover(sender As Object, e As EventArgs) Handles btn_save.MouseHover           '# 
    '#                                 '# 
    ToolTip1.SetToolTip(btn_save, "Save changes to your career file") 
End Sub 
Private Sub cb_combo_MouseHover(sender As Object, e As EventArgs) Handles cb_combo.MouseHover           '# 
    '#                                 '# 
    ToolTip1.SetToolTip(cb_combo, "tick if you want to edit transfer budget")               '# 
End Sub 

'######################################################################################################################################### 
End Class 

任何帮助将不胜感激。

+3

我不想这一切的代码也许发现问题。你是否确定问题出现在哪里?只是倾销代码(尤其是“完整程序”)和“它不起作用”在这里并不是真正的精神。 – Styxxy 2013-02-12 09:34:05

+0

对不起,这里的代码落在这里:**如果cb_combo.Checked = True然后 stream.Position =&HD5DC stream.WriteByte(transferbudget)** End If – lordofdogtown83 2013-02-12 09:37:03

回答

1

您正将Stringtransferbudget)传递给方法。 WriteByte方法需要Byte,而不是String。如果您有Option Strict On,您应该这样做会导致编译错误。但是,由于您有Option Strict Off,它允许您编译并自动为您插入从StringByte的类型转换。如果字符串中的值超出Byte(0 - 255)的最小值和最大值,则类型转换操作将引发溢出异常。在这里你设置transferbudget变量的代码:

Select Case ComboBox1.SelectedItem 
    Case Is = "-£10 million (are you crazy CHALLENGE)" 
     transferbudget = "100" 
    Case Is = "-£2 million (mid level CHALLENGE)" 
     transferbudget = "200" 
    Case Is = "-£500k (lower league CHALLENGE)" 
     transferbudget = "500" 'GAH! 
    Case Is = "£500k (tough)" 
     transferbudget = "05" 
    Case Is = "£5 million" 
     transferbudget = "5" 
    Case Is = "£10 million" 
     transferbudget = "10" 
    Case Is = "£25 million" 
     transferbudget = "25" 
    Case Is = "£50 million" 
     transferbudget = "50000000" 'GAH! 
    Case Is = "£99 million" 
     transferbudget = "999" 'GAH!    
End Select 

正如你所看到的,有几个值有是大于255

+0

最初我在这些位置有十六进制值,但是然后我将它们改为实际值(例如10mil为“10000000”)但它仍然下降,所以我开始对50mil选项进行更改以测试然后我将改变它们(以节省我的时间)。我试着将它从一个字符串改为一个整数,这也不起作用。你的帖子对你非常有帮助。谢谢。 – lordofdogtown83 2013-02-12 09:55:23

+0

最初存储它们的变量类型无关紧要。问题是,最后你试图将整个值作为单个字节输出。只要该值对于一个字节来说太大,无论初始变量类型如何,转换总是会失败。查看'BinaryWriter'类,了解将多字节整数输出到流的方法。 – 2013-02-12 11:24:00

+0

@ lordofdogtown83 - 注意:如果您切换了选项严格打开,则此错误将被标记。你现在应该这样做:http://www.codinghorror.com/blog/2005/08/option-strict-and-option-explicit-in-vbnet-2005.html – 2013-02-12 13:32:33

相关问题