2013-10-01 3 views
0

Я пытаюсь прочитать следующий текстовый файл: (обходя первые 8 строк) и чтение из стрелочки каждого столбец enter image description hereИндекс оказался вне границ массива? C# формы

И делаю это, помещая каждое значение столбца в массиве, который диктуется положением и length

Чтобы проверить, действительно ли значение массива зафиксировало значение столбца, я хочу видеть значение [0] при нажатии другой кнопки. Но когда я запускаю свое приложение, я получаю ошибку, что мой индекс был вне границ массива? Как, когда размер моего массива равен 3, и я не выхожу за рамки этого.

string[] val = new string[3 ]; // One of the 3 arrays - this stores column values 

    public Form1() 
    { 
     InitializeComponent(); 
    } 

    private void button1_Click(object sender, EventArgs e) 
    { 
     OpenFileDialog ofd = new OpenFileDialog(); 
     if (ofd.ShowDialog() == System.Windows.Forms.DialogResult.OK) 
     { 

      string[] lines = File.ReadAllLines(ofd.FileName).Skip(8).ToArray(); 
      textBox1.Lines = lines; 

      int[] pos = new int[3] { 3, 6,18}; //setlen&pos to read specific clmn vals 
      int[] len = new int[3] {2, 10,28}; // only doing 3 columns right now 



      foreach (string line in textBox1.Lines) 
      { 
       for (int j = 0; j <= 3; j++) 
       { 
        val[j] = line.Substring(pos[j], len[j]); // THIS IS WHERE PROBLEM OCCURS 
       } 

      } 

     } 
    } 

    private void button2_Click(object sender, EventArgs e) 
    { // Now this is where I am testing to see what actual value is stored in my //value array by simply making it show up when I click the button. 

     MessageBox.Show(val[0]); 
    } 
} 

}

ответ

2

массивы 0 индексируются, это означает, что массив с 3-х элементов будет иметь по индексам 0, 1 и 2 элементы.

3 находится за пределами границ, поэтому, когда вы пытаетесь получить доступ к pos[3] или len[3], ваша программа выдает исключение.

использование j < 3 вместо j<=3

for (int j = 0; j < 3; j++) 
{ 
    val[j] = line.Substring(pos[j], len[j]); // THIS IS WHERE PROBLEM OCCURS 
} 
2

Проблема в том, что вы пройти весь путь до j == 3 в for заявлении. Это будет четвертый элемент, так как массивы с нуля, поэтому изменить for заявление:

for (int j = 0; j < 3; j++) 

и вы будете хорошо идти.

2

Массив pos имеет три значения в нем.

Рассмотрите ваш цикл.

  1. Первый i равен нулю. Это меньше или равно трем.
  2. Тогда я один. Это меньше или равно трем.
  3. Тогда я - два. Это меньше или равно трем.
  4. Тогда я три. Это меньше или равно трем.
  5. Тогда я четыре. То есть не меньше или равно трем.

Он выполняет тело петли 4 раза. Есть 3 предмета.

Для исправления, чтобы следовать стандартным соглашениям, просто используйте менее, чем или равные, в проверке состояния вашего цикла for.

Смежные вопросы