2016-12-28 46 views
-1

我试图做一个程序,它会找出哪一个数组的一半加在一起是更大的范围,但不断收到这个错误,我似乎无法找出原因系统索引出的C#

“尝试从数组后部开始工作时,第31行的”平均Mark.exe“中出现”System.IndexOutOfRangeException“类型的未处理异常。

我对c#很新,想到我在做什么应该工作? 非常感谢!

using System; 
using System.Collections.Generic; 
using System.Linq; 
using System.Text; 
using System.Threading.Tasks; 

namespace most_frequent_int 
{ 
    class Program 
    { 
     static void Main(string[] args) 
     { 
      halfCheck(new int[] {1,1,2,3}); 
     } 

     static void halfCheck(int[] checkArray) 
     { 
      int fHalf = 0; 
      int sHalf=0; 

      //even method 
      if (checkArray.Length % 2 == 0) 
      {    
       for (int i= 0;i<checkArray.Length/2;i++)//check first half even 
       { 
        fHalf = fHalf + checkArray[i]; 
       } 

       for (int i=checkArray.Length;i>checkArray.Length/2;i--) 
       { 
        sHalf = sHalf + checkArray[i]; 
        Console.WriteLine(sHalf); 
       } 

       if (fHalf > sHalf) 
       { 
        Console.WriteLine("The first half is bigger"); 
       } 
       else 
       { 
        Console.WriteLine("The second half is bigger"); 
       } 
       Console.ReadLine(); 

      } 

      //odd method 
      else 
      { 
       Console.WriteLine("odd"); 
      } 
     } 
    } 
} 
+0

调试器告诉你什么时候你通过代码? –

+0

@哈维拉什你可以评论错误发生的地方 –

+0

http://stackoverflow.com/questions/20940979/what-is-an-indexoutofrangeexception-and-how-do-i-fix-it调试它并修复错误 –

回答

2

该错误是在这样的代码:

for (int i=checkArray.Length;i>checkArray.Length/2;i--) 
{ 
    sHalf = sHalf + checkArray[i]; 
    Console.WriteLine(sHalf); 
} 

Length属性是基于1的,因为它计数阵列中的元素,但索引是从零开始。当您尝试访问checkArray[i]时,i值已超过数组的末尾。考虑从checkArray.Length - 1开始。

0

在此行中:

for (int i = checkArray.Length; i > checkArray.Length/2; i--) 

要指定i到阵列的第一个迭代的长度。你不能通过它的长度来索引一个数组,因为它比最后一个有效位置多一个。

尝试这种情况:

for (int i = checkArray.Length - 1; i > checkArray.Length/2; i--) 
0

的问题是在下面的行:

for (int i=checkArray.Length;i>checkArray.Length/2;i--) 

访问的第一个元素是checkArray[checkArray.Length]其是从数组中。允许的索引是checkArray.Length -1

尝试:

for (int i=checkArray.Length - 1; i > checkArray.Length/2; i--) 
0

这条线:

for (int i=checkArray.Length;i>checkArray.Length/2;i--)

每次都会抛出一个IndexOutofRangeException。使用数组时,.length属性返回数组中元素的数量,这与最高索引不同。

例如,如果checkArray有5个元素,索引为0,1,2,3和4。checkArray.Length将返回元件的数量,这是5

由于您的for循环开头i=checkArray.length,它尝试的第一个索引总是会超出范围。改为尝试i=checkArray.Length-1

0

你只需要改变我在第二个循环开始。 I = checkArray.Length - 1

using System; 
using System.Collections.Generic; 
using System.Linq; 
using System.Text; 
using System.Threading.Tasks; 

namespace most_frequent_int 
{ 
class Program 
{ 
    static void Main(string[] args) 
    { 
    halfCheck(new int[] {1,1,2,3}); 
    } 

    static void halfCheck(int[] checkArray) 
    { 
     int fHalf = 0; 
     int sHalf=0; 

     //even method 
     if (checkArray.Length % 2 == 0) 
     {    
      for (int i= 0;i<checkArray.Length/2;i++)//check first half even 
      { 
       fHalf = fHalf + checkArray[i]; 
      } 

     for (int i=checkArray.Length - 1;i>checkArray.Length/2;i--) 
      { 
       sHalf = sHalf + checkArray[i]; 
       Console.WriteLine(sHalf); 
      } 

      if (fHalf > sHalf) 
      { 
       Console.WriteLine("The first half is bigger"); 
      } 
      else 
      { 
       Console.WriteLine("The second half is bigger"); 
      } 
      Console.ReadLine(); 

     } 

     //odd method 
     else 
     { 
      Console.WriteLine("odd"); 
     } 

    } 

} 
} 

阵列被编入索引从0开始,但长度在1开始所以你的阵列长度是4和但checkArray [4]不存在作为在阵列中的最后一个项目是3.长度-1应该解决它。