2016-12-15 2 views
-1

Извините за ужасную формулировку моего последнего вопроса, я был в полусонном состоянии, и было полночь. На этот раз я постараюсь быть более ясным.Ошибка Array за пределами границ VB

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

В настоящее время я пытаюсь извлечь содержимое файла запаса и отсортировать его в таблицах продуктов. Это мой текущий код для получения данных:

 Using fs As StreamReader = New StreamReader("The File Path (Is private)") 
     Dim line As String = "ERROR" 
     line = fs.ReadLine() 
     While line <> Nothing 

      Dim pos As Integer = 0 
      Dim split(3) As String 
      pos = products.Length 
      split = line.Split("|") 
      productCodes(productCodes.Length) = split(0) 
      products(products.Length, 0) = split(1) 
      products(products.Length, 1) = split(2) 
      products(products.Length, 2) = split(3) 
      line = fs.ReadLine() 
     End While 
    End Using 

Я убедился, что путь к файлу делает, на самом деле, перейдите к файлу. Я просмотрел отладочную информацию, чтобы найти, что все данные проходят в мою таблицу «split». Ошибка вызывается, как только я пытаюсь передать данные.

Это где я объявляю две таблицы используются:

Dim productCodes() As String = {} 
    Dim products(,) As Object = {} 

Может кто-нибудь, пожалуйста, объясните, почему это происходит?

Заранее спасибо ~ Hydro

+2

создавать пустые массивы так что любой доступ индекс будет вне пределов, дать их требуемый размер (или лучше использовать изменяемый размер контейнера) – Sehnsucht

+3

Используйте 'List (Of String)' для 'Dim productCodes() As String = {}' и создайте класс, который представляет ваши данные вместо использования двумерного массива. Затем вы можете использовать «Список (Of YourData)» – Fabio

+0

Поскольку вам необходимо предоставить размер массива перед чтением файла, массивы будут работать только в том случае, если вы всегда будете иметь одинаковое количество строк. – Fabio

ответ

0

Объявив массивы, как вы сделали:

Dim productCodes() As String = {} 
Dim products(,) As Object = {} 

Вы назначаете размер 0 для всех массивов, так что во время цикла, он будет в конечном итоге попытаться получить доступ позицию, которая ранее не была объявлена ​​компилятору. Это то же самое, что объявить массив размером 10 Dim MyArray(10) и попытаться получить доступ к позиции 11 MyArray(11) = something.

Вы должны либо объявить его с правильным размером, или ReDim его во время выполнения:

Dim productCodes(10) As String 

или

Dim productCodes() As String 
Dim Products(,) As String 
Dim Position as integer = 0 
'code here 
While line <> Nothing  
    Redim Preserve productCodes(Position) 
    Redim Preserve products(2,Position) 
    Dim split(3) As String 
    pos = products.Length 
    split = line.Split("|") 
    productCodes(Position) = split(0) 
    products(0,Position) = split(1) 
    products(1,Position) = split(2) 
    products(2,Position) = split(3) 
    line = fs.ReadLine() 
    Position+=1 
End While 
+4

Выбор слова может вводить в заблуждение (особенно для будущего читателя с познанием начинающего): 'Dim arr (10)' не создает массив размером 10, а размером 11 (от 0 до 10) и в 'arr (11) '11 не является позицией (как в« мы получаем 11-й элемент »), а с индексом * (ноль) *. – Sehnsucht