Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/287.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 越界异常_C#_Segmentation Fault - Fatal编程技术网

C# 越界异常

C# 越界异常,c#,segmentation-fault,C#,Segmentation Fault,自从我使用树已经有一段时间了,我在while循环中遇到了一个越界异常。字符数组是从零到长度-1字符数组是从零到长度-1你应该试着写int I=x.length-1 当x包含从0到x.Length-1的索引项时,x[expression.Length]似乎只是一个超出范围的项。您应该尝试编写int i=x.Length-1 只要x包含从0到x.Length-1的索引项,x[expression.Length]似乎只是一个超出范围的项。我将反向测试: public override Models.C

自从我使用树已经有一段时间了,我在while循环中遇到了一个越界异常。

字符数组是从零到长度-1

字符数组是从零到长度-1

你应该试着写
int I=x.length-1


x
包含从
0
x.Length-1
的索引项时,
x[expression.Length]
似乎只是一个超出范围的项。

您应该尝试编写
int i=x.Length-1

只要
x
包含从
0
x.Length-1
的索引项,
x[expression.Length]
似乎只是一个超出范围的项。

我将反向测试:

public override Models.CalculationNode Parse(string expression)
{
    var calNode = new Models.CalculationNode();

    int i = expression.Length;
    char[] x = expression.ToCharArray();
    string temp = "";

    //Backwards assembly of the tree

    //Right Node
    while (!IsOperator(x[i]) && i > 0)
    {
        if (!x[i].Equals(' ')) temp = x[i] + temp;
        i--;
    }
}
因为将首先计算
等运算符,循环结束时我将为-1(尽管循环开始时可能出现任何问题)。

我将反向测试:

public override Models.CalculationNode Parse(string expression)
{
    var calNode = new Models.CalculationNode();

    int i = expression.Length;
    char[] x = expression.ToCharArray();
    string temp = "";

    //Backwards assembly of the tree

    //Right Node
    while (!IsOperator(x[i]) && i > 0)
    {
        if (!x[i].Equals(' ')) temp = x[i] + temp;
        i--;
    }
}

因为将首先计算
IsOperator
,循环结束时i将为-1(尽管循环开始时可能出现任何问题)。

当从
i=expression.Length开始时,会出现off-by-1错误。第一个指标马上就出界了。您可以将循环重写为for循环,如下所示:

while (i >= 0 && !IsOperator(x[i]))

当您从
i=expression.Length
开始时,出现了一个off-by-1错误。第一个指标马上就出界了。您可以将循环重写为for循环,如下所示:

while (i >= 0 && !IsOperator(x[i]))
你需要:

char[] x = expression.ToCharArray();
string temp = "";

//Backwards assembly of the tree

//Right Node
for (int i = x.Length - 1; i >= 0 && !IsOperator(x[i]); --i)
{
    if (!x[i].Equals(' ')) temp = x[i] + temp;
}
然后在while循环中,您需要:

int i = expression.Length;
数组基于0,因此0是第一个位置,最终位置是长度减1。

您需要:

char[] x = expression.ToCharArray();
string temp = "";

//Backwards assembly of the tree

//Right Node
for (int i = x.Length - 1; i >= 0 && !IsOperator(x[i]); --i)
{
    if (!x[i].Equals(' ')) temp = x[i] + temp;
}
然后在while循环中,您需要:

int i = expression.Length;

数组是基于0的,因此0是第一个位置,最后一个位置是长度减去1。

您将i设置为字符串的长度,从1开始。 但是,数组索引从0开始,因此当您在末尾访问元素时,实际上是在试图将1超出您的边界。这是抛出错误的循环的第一次运行


您需要将-1添加到i的初始化中。

您将i设置为字符串的长度,从1开始。 但是,数组索引从0开始,因此当您在末尾访问元素时,实际上是在试图将1超出您的边界。这是抛出错误的循环的第一次运行

您需要在i的初始化中添加-1