none
"索引在陣列的界限之外"該怎麼解決? RRS feed

  • 問題

  • 我的程式發生一個問題:

    類型 'System.IndexOutOfRangeException' 的未處理例外狀況發生於 System.Windows.Forms.dll

    其他資訊: 索引在陣列的界限之外。

    =====

    Imports System.IO.Ports
    Public Class Form1
        Private comport As SerialPort
        Private totalLength As Int32 = 0
        Private Delegate Sub Display(ByVal buffer As Byte())
        Private Delegate Sub show(ByVal buffer As Byte())

        Private Sub DisplayText(ByVal buffer As Byte())
            TextBox1.Text &= String.Format("{0}{1}", BitConverter.ToString(buffer), Environment.NewLine)
            totalLength = totalLength + buffer.Length
            Label2.Text = totalLength.ToString()

        End Sub

        Private Sub showdata(ByVal buffer As Byte())
            Dim temperature As Double = Math.Round((buffer(5) * 16 ^ 2) / 1024 + buffer(6), 2) * 5 * 17.94 - 21.179
            TextBox2.Text &= temperature & vbNewLine

        End Sub

        Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
            comport = New SerialPort("COM1", 19200, Parity.None, 8, StopBits.One)
            AddHandler comport.DataReceived, AddressOf comport_DataReceived
            If comport.IsOpen = False Then
                comport.Open()
            End If
        End Sub

        Private Sub Button_ClearTextbox_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button_ClearTextbox.Click
            TextBox1.Clear()
        End Sub


        Private Sub comport_DataReceived(ByVal sender As Object, ByVal e As SerialDataReceivedEventArgs)
            Dim buffer(1023) As Byte
            Dim length As Int32 = DirectCast(sender, SerialPort).Read(buffer, 0, buffer.Length)
            Array.Resize(buffer, length)
            Dim Packetbuffer() As Byte = buffer
            Dim Processbuffer() As Byte = buffer

            Dim Packet As New Display(AddressOf DisplayText)
            Me.Invoke(Packet, New Object() {Packetbuffer})
            Dim Process As New show(AddressOf showdata)
            Me.Invoke(Process, New Object() {Processbuffer})

        End Sub

        Private Sub Label1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Label1.Click

        End Sub
    End Class

    ====

    有問題的是這段

       Private Sub comport_DataReceived(ByVal sender As Object, ByVal e As SerialDataReceivedEventArgs)
            Dim buffer(1023) As Byte
            Dim length As Int32 = DirectCast(sender, SerialPort).Read(buffer, 0, buffer.Length)
            Array.Resize(buffer, length)
            Dim Packetbuffer() As Byte = buffer
            Dim Processbuffer() As Byte = buffer

            Dim Packet As New Display(AddressOf DisplayText)
            Me.Invoke(Packet, New Object() {Packetbuffer})
            Dim Process As New show(AddressOf showdata)
            Me.Invoke(Process, New Object() {Processbuffer})

        End Sub


    其中的Me.Invoke(Process, New Object() {Processbuffer})停下來

    ===

    Me.Invoke(Packet, New Object() {Packetbuffer})是我用來顯示封包內容的

    另外 Me.Invoke(Process, New Object() {Processbuffer})是我用來轉換封包的位元組值換成物理量

    如果沒有設show來作為委外

    想集中在DisplayText程式段位元組值換成物理量轉換,並放在textbox2中

    程式執行他會說我不能"跨程序執行"...

    那我要該怎麼修正會比較好?

    另外請教 Me.Invoke(Packet, New Object() {Packetbuffer})

    Me.Invoke有沒有詳細的意思和範例可供了解?

    以及委外是在什麼狀況下做是比較好?

    2013年5月28日 上午 10:27

解答

  • 常見的情形例如 陣列是空的,但程式去取陣列裡面的值,或是陣列長度是5,程式卻取index為6的陣列值,debug時,注意陣列的變化應該就可找到問題.
    2013年5月28日 下午 02:19

所有回覆

  • 常見的情形例如 陣列是空的,但程式去取陣列裡面的值,或是陣列長度是5,程式卻取index為6的陣列值,debug時,注意陣列的變化應該就可找到問題.
    2013年5月28日 下午 02:19
  •         Dim Packetbuffer() As Byte = buffer
            Dim Processbuffer() As Byte = buffer
     

    VBNET 遵照 .Net 預設為參照,與 VB6 為複製不同。

    所以你這三個 byte() 陣列對 VBNET 來說都一樣,動一個,另外兩個也是一樣。

    2013年5月28日 下午 03:36
  • Control.Invoke 方法


    在現實生活中,你和誰在一起的確很重要,甚至能改變你的成長軌跡,決定你的人生成敗。 和什麼樣的人在一起,就會有什麼樣的人生。 和勤奮的人在一起,你不會懶惰; 和積極的人在一起,你不會消沈; 與智者同行,你會不同凡響; 與高人為伍,你能登上巔峰。

    2013年5月29日 下午 12:57
    版主