【问题标题】:Index was outside the bounds of the array exception inside while loop索引超出了 while 循环内的数组异常的范围
【发布时间】:2017-11-26 16:50:10
【问题描述】:

一个例外:

索引超出了数组的范围

被扔进 if 下面或 else 下面

 public static Int64[] PrimeGenerator(Int64 length = 1)
{
    Int64 pos = 0;
    Int64[] primes = new Int64[length];
    Int64 Cprime = 2;
    Int64 controller = 0;//On evens it adds one less than, on odds it adds oone more than
    while(length >= 0)
    {
        if(pos == 0)
        {
            primes[pos] = 2;
            goto End;
        }
        if(controller % 2 == 0)
        {
            primes[pos] = (2 * Cprime - 1);
        }
        else
        {
            primes[pos] = (2 * Cprime + 1);
        }
        End:
        Cprime = primes[pos];
        controller++;
        pos++;
        length--;
    }
    return primes;
}

我查看了 Visual Studio 调试器,它说 Cprime 是一个疯狂的负数,而长度不应该是 0

当我将所有 Int64 更改为 UInt64 时,Cprime 是一些疯狂的正整数,长度仍然为零

调用这段代码的代码长这样,print是重命名的Console.WriteLine

static void Main()
{
    UInt64 p = 1000;
    UInt64[] primes = PrimeGenerator(p);
    bool[] truth = BadArrayTest(primes);
    foreach(bool tru in truth)
    {
        print(tru);
    }
    System.Threading.Thread.Sleep(50000);
    Environment.Exit(0);
}

【问题讨论】:

    标签: c# math primes


    【解决方案1】:

    就这样做

    while(length > 0)
    

    索引是零基数,这意味着从零开始,但长度不是那样的 所以你总是有一个超出数组长度的循环周期。

    【讨论】:

      【解决方案2】:

      您的数组属于length,但您通过循环length+1 运行了几次。顺便说一句,永远不要使用Goto

      【讨论】:

        猜你喜欢
        • 2014-05-17
        • 1970-01-01
        • 2017-06-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多