-4

我是使用 c++ 的新手,所以这可能是一个向量问题。我收到一个浮点错误。我不认为这是除以零错误。任何帮助,将不胜感激。

代码可以编译,但是运行时会弹出错误。“浮点异常(核心转储)”

    vector<int> radixSort (vector<int> &numbs, int maxA)
    {
        vector<vector<int> >temp1;
        vector<vector<int> >temp2;

        for (int i = 0; i < 10 ; i++)
            {
                temp1.push_back(vector<int>());
                temp2.push_back(vector<int>());
            }

        int x = 1;
        int plc = 0;
        while (maxA/x > 0)
        {
            plc = plc + 1;
            x = x * 10;
        }
        for (int i = 0; i < (int)numbs.size(); i++)
        {
            int aryLoc = numbs[i] % 10;
            temp1[aryLoc].push_back(numbs[i]);
        }
        plc = plc - 1;
        int modDiv = 100;
        int intDiv = 10;
        bool isTemp1 = true;
        while (plc > 0)
        {
            for (int i = 0; i < 10 ; i++)
            {
                if (temp1[i].size() > 0)
                {
                    for (int j = 0; j < temp1[i].size() ; j++)
                    {
                        int aryLoc = temp1[i][j] % modDiv;
                        aryLoc = temp1[i][j] / intDiv;
                        temp2[aryLoc].push_back(numbs[i]);
                        modDiv = modDiv * 10;
                        intDiv = intDiv * 10;
                    }
                }
            }
            plc = plc - 1;
            isTemp1 = false;
            for (int i = 0; i < 10 ; i++)
            {
                temp1[i].clear();
            }
            if (plc > 0)
            {
                for (int i = 0; i < 10 ; i++)
                {
                    if (temp2[i].size() > 0)
                    {
                        for (int j = 0; j < temp2[i].size() ; j++)
                        {
                            int aryLoc = temp2[i][j] % modDiv;
                            aryLoc = temp2[i][j] / intDiv;
                            temp1[aryLoc].push_back(numbs[i]);
                            modDiv = modDiv * 10;
                            intDiv = intDiv * 10;
                        }
                    }
                }
                plc = plc - 1;
                isTemp1 = true;
                for (int i = 0; i < 10 ; i++)
                {
                    temp2[i].clear();
                }
            }
        }

        if (isTemp1 == true)
        {
            int y = 0;
            for (int i = 0; i < 10 ; i++)
            {
                if (temp1[i].size() > 0)
                {
                    for (int j = 0; j < temp1[i].size() ; j++)
                    {
                        numbs[y] = temp1[i][j];
                        y++;
                    }
                }
            }
        }

        else
        {
            int y = 0;
            for (int i = 0; i < 10 ; i++)
            {
                if (temp2[i].size() > 0)
                {
                    for (int j = 0; j < temp2[i].size() ; j++)
                    {
                        numbs[y] = temp2[i][j];
                        y++;
                    }
                }
            }
        }

        return numbs;
    }

感谢您的帮助,当我发现我的错误时,现在似乎正在工作这里是固定副本

vector<int> radixSort (vector<int> &numbs, int maxA)
{
    vector<vector<int> >temp1;
    vector<vector<int> >temp2;

    for (int i = 0; i < 10 ; i++)
        {
            temp1.push_back(vector<int>());
            temp2.push_back(vector<int>());
        }

    int x = 1;
    int plc = 0;
    while (maxA/x > 0)
    {
        plc = plc + 1;
        x = x * 10;
    }
    for (int i = 0; i < (int)numbs.size(); i++)
    {
        int aryLoc = numbs[i] % 10;
        temp1[aryLoc].push_back(numbs[i]);
    }
    plc = plc - 1;
    int modDiv = 100;
    int intDiv = 10;
    bool isTemp1 = true;
    while (plc > 0)
    {
        for (int i = 0; i < 10 ; i++)
        {
            if (temp1[i].size() > 0)
            {
                for (int j = 0; j < temp1[i].size() ; j++)
                {
                    int aryLoc = temp1[i][j] % modDiv;
                    aryLoc = aryLoc / intDiv;
                    temp2[aryLoc].push_back(temp1[i][j]);
                }
            }
        }
        modDiv = modDiv * 10;
        intDiv = intDiv * 10;
        plc = plc - 1;
        isTemp1 = false;
        for (int i = 0; i < 10 ; i++)
        {
            temp1[i].clear();
        }
        if (plc > 0)
        {
            for (int i = 0; i < 10 ; i++)
            {
                if (temp2[i].size() > 0)
                {
                    for (int j = 0; j < temp2[i].size() ; j++)
                    {
                        int aryLoc = temp2[i][j] % modDiv;
                        aryLoc = aryLoc / intDiv;
                        temp1[aryLoc].push_back(temp2[i][j]);
                    }
                }
            }
            modDiv = modDiv * 10;
            intDiv = intDiv * 10;
            plc = plc - 1;
            isTemp1 = true;
            for (int i = 0; i < 10 ; i++)
            {
                temp2[i].clear();
            }
        }
    }

    if (isTemp1 == true)
    {
        int y = 0;
        for (int i = 0; i < 10 ; i++)
        {
            if (temp1[i].size() > 0)
            {
                for (int j = 0; j < temp1[i].size() ; j++)
                {
                    numbs[y] = temp1[i][j];
                    y++;
                }
            }
        }
    }

    else
    {
        int y = 0;
        for (int i = 0; i < 10 ; i++)
        {
            if (temp2[i].size() > 0)
            {
                for (int j = 0; j < temp2[i].size() ; j++)
                {
                    numbs[y] = temp2[i][j];
                    y++;
                }
            }
        }
    }

    return numbs;
}
4

1 回答 1

1

modDiv首先,你的和的乘法intDiv发生在错误的地方,但我会让你弄清楚。
此外,您的计算aryLoc有点偏离 - 它并不总是在 0 和 9
之间。当您在向量之间移动元素时,最有可能出现复制粘贴错误。

但是关于这个特定的错误:有趣的是,“浮点异常”并不一定意味着浮点错误,例如,如果将整数除以零,就会发生这种情况。

如果向量足够大(并且取决于maxA向量中的值),modDiv则会溢出,这是未定义的行为。
换句话说,任何事情都可能发生。

我不确定是什么maxA意思 - 我在测试时将其设置为向量中的最大值。

使用我的 g++,如果我modDiv通过循环登录,我会得到这个输出:

> ./sort 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 100000
modDiv: 1000
modDiv: 10000
modDiv: 100000
modDiv: 1000000
modDiv: 10000000
modDiv: 100000000
modDiv: 1000000000
modDiv: 1410065408
modDiv: 1215752192
modDiv: -727379968
modDiv: 1316134912
modDiv: 276447232
modDiv: -1530494976
modDiv: 1874919424
modDiv: 1569325056
modDiv: -1486618624
modDiv: -1981284352
modDiv: 1661992960
modDiv: -559939584
modDiv: -1304428544
modDiv: -159383552
modDiv: -1593835520
modDiv: 1241513984
modDiv: -469762048
modDiv: -402653184
modDiv: 268435456
modDiv: -1610612736
modDiv: 1073741824
modDiv: -2147483648
modDiv: 0
Floating point exception (core dumped)

因此,至少在我的情况下,“任何事情都可能发生”在围绕 int 范围稍微绕道之后结束,模数为零。

当你的乘法正确时,这个错误应该会消失。
修复aryLoc应该处理您将遇到的其他核心转储。

于 2013-06-14T12:33:32.593 回答