2017-01-30 13 views
0

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

RoundInfo[] rounds = new RoundInfo[10]; 
int numRounds = 0; 
RoundInfo ri; 
RoundInfo[] newRI; 

public void AddRound(int height, int speed) 
     { 
      if (numRounds >= rounds.Length) // creates a new array of RI objects if numRounds is greater than rounds.Length 
      { 
       newRI = new RoundInfo[numRounds + 1]; 
       // Console.WriteLine("numRounds: {0} length: {1}", numRounds, rounds.Length); // me checking if the AddRound correctly increments numRounds, it does. 
       //Console.WriteLine(newRI.Length); 
       for (int i = 0; i < newRI.Length; i++) 
        newRI[i] = rounds[i]; // *THE PROGRAM CRASHES HERE* 
       rounds = newRI; 
       ri = new RoundInfo(height, speed); 
       rounds[numRounds] = ri; 
       numRounds++; 

      } 
      if (numRounds < rounds.Length) // the program goes through this fine 
      { 
       ri = new RoundInfo(height, speed); 
       rounds[numRounds] = ri; 
       numRounds++; 
      } 

     } 

Я не понимаю, почему он сработает, если новый массив длиннее.

+0

'newRI' может пойти 'newRI.Length', но не старый. Ничего из этого не требуется с «List », и даже если вы «имели» использовать массив, есть «Array.Copy» – Plutonix

ответ

1

потому что вы входите первым, если numRounds == rounds.Length. где 10 == rounds.Length (который 10)

Theng прибавляя

 if (numRounds >= rounds.Length) // here you're having numRounds as 10 
     { 
      newRI = new RoundInfo[numRounds + 1]; //here you're adding + 1 will get newRI = new RoundInfo[11] 
      for (int i = 0; i < newRI.Length; i++) 
       newRI[i] = rounds[i]; // *THE PROGRAM CRASHES HERE* 
             // so in here your program will crash due to indexOutOfBOunds because newRI[11] = rounds[11]; 
             //rounds[11] is not existing 
      rounds = newRI; 
      ri = new RoundInfo(height, speed); 
      rounds[numRounds] = ri; 
      numRounds++; 
     } 

вы можете предотвратить это, не добавляя +1 на newRI

 if (numRounds >= rounds.Length) 
     { 
      newRI = new RoundInfo[numRounds]; //remove +1 here 
      //etc codes 
     } 

Я надеваю Не знаю, каково ваше намерение в этой части

// создает новый массив объектов RI, если numRounds больше, чем rounds.Length

копирование массива, но превышающее предыдущую длину массива невозможно. Кажется, вы пытаетесь сделать (newArray [oldArray.Length + 1] == oldArray [oldArray.Length]) , который вы не можете сделать, потому что он действительно выйдет за рамки.

newArray [11] не может иметь oldArray [11], так как он не существует

то, что вы можете попробовать это длина oldArray, а не новый

for (int i = 0; i < rounds.Length; i++) 
      newRI[i] = rounds[i]; 
+0

Спасибо! Я смог это исправить! –