Member 13495631 Ответов: 2

Необработанное исключение типа "system.indexoutofrangeexception" произошло в windowsapplication1.exe дополнительная информация: индекс находился за пределами массива.


dim ECUData(27) as integer
dim RXArray(27) as integer


он показывает мне ошибку на 12-м индексе ECUdata и Rxarray

Я нахожусь в самом начале и действительно пытаюсь научиться программированию.

Что я уже пробовал:

Private Sub Receiver(ByVal sender As Object, ByVal e As SerialDataReceivedEventArgs) Handles COMPorts.DataReceived
        If COMPorts.IsOpen = False Then
            COMPorts.Open()
        End If
        Dim RXByte As Byte

        RXCnt = 0
        Do

            RXByte = COMPorts.ReadByte

            RXArray(RXCnt) = Chr(RXByte) ' Convert each byte to two hexadecimal characters
            RXCnt = RXCnt + 1
            ECUData(RXCnt) = RXByte  <---------Getting Error in This Line
        Loop Until (COMPorts.BytesToRead = 0) ' Don't return if more bytes have become available in the meantime
        '----- End of communication protocol handling -------------------------------------------------------------
        Me.Invoke(New MethodInvoker(AddressOf Display)) ' Start "Display" on the UI thread
    End Sub

Dave Kreskowiak

Вы смотрели на стоимость RXCnt? Держу пари, что его 27, когда ошибка бросает. Элементы в массиве, который вы выделили, пронумерованы от 0 до 26, Нет 27.

Richard Deeming

Это ... VB.NET, таким образом, массивы на самом деле имеют 28 элементов от 0 до 27. :)

Dave Kreskowiak

<headdesk>еще не заходил VB.NET уже довольно давно.

2 Ответов

Рейтинг:
1

OriginalGriff

Используйте отладчик.
Поместите точку останова в первую строку функции и запустите код через отладчик. Затем посмотрите на свой код и на свои данные и определите, что должно произойти вручную. Затем по одному шагу в каждой строке проверяйте, что то, что вы ожидали, произойдет именно так, как и произошло. Когда это не так, тогда у вас есть проблема, и вы можете вернуться назад (или запустить ее снова и посмотреть более внимательно), чтобы выяснить, почему.

Извините, но мы не можем сделать это за вас - пришло время вам освоить новый (и очень, очень полезный) навык: отладку!

Я подозреваю, что из-за того, что вы нигде не сбрасываете RXCnt, он просто переполняет Ваш массив.


Рейтинг:
0

CPallini

Вы знаете, что это произойдет, если

COMPorts.BytesToRead > 27

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


Richard Deeming

Это ... VB.NET, таким образом, число в скобках является верхней границей, нет длина. Это 29th байт, который вызывает проблему. :)