崩溃连接到传递std :: array

时间:2016-06-26 18:42:26

标签: c++ arrays

这个问题已经完全重写了。请考虑再次阅读全文。

我在使用标准数组的程序时遇到问题。下面的代码是尽可能剥离的完整程序,但仍然会重现错误。

我无法理解问题所在。正如您可能阅读的那样,注释1,2(同时)和3所有信号代码,如果删除,将导致程序在没有崩溃的情况下运行。

此外,将costant N设置为3或使用数组的其他值组合都会导致程序运行完成。请注意,除以0不能解释所有失败点(见注释#3)。

#include <iostream>
#include <array>
#include <math.h>

#define N 4

void f1(std::array<std::array<float, N>, N> a, std::array<float, N> b, std::array<float, N>& c);
void f2a(std::array<std::array<float, N>, N>& a, std::array<float, N>& b, std::array<float, N>& d);
void f2b(std::array<std::array<float, N>, N>& a, std::array<float, N>& b, std::array<float, N>& d, int i);
void f3(std::array<std::array<float, N>, N> a, std::array<float, N> b, std::array<float, N>& c);

int main()
{
    std::array<std::array<float, N>, N> a = { { { 1, 1, 0, 3 },{ 2, 1, -1, 1 },{ 3, -1, -1, 2 },{ -1, 2, 3, -1 } } };
    std::array<float, N> b = { 4, 1, -3, 4 };
    std::array<float, N> c;

    f1(a, b, c);

    std::cin.get();

    return 0;
}

void f1(std::array<std::array<float, N>, N> a, std::array<float, N> b, std::array<float, N>& c)
{
    std::array<float, N> d;

    for (int i = 0; i < N; i++)
    {
        d[i] = fabs(a[i][0]);

        for (int j = 1; j < N; j++)
        {
            if (fabs(a[i][j] > d[i]))
            {
                d[i] = fabs(a[i][j]);
            }
        }
    }

    //switching b and d
    f2a(a, b, d);

    f3(a, b, c);

}

void f2a(std::array<std::array<float, N>, N>& a, std::array<float, N>& b, std::array<float, N>& d)
{
    for (int i = 0; i < (N - 1); i++)
    {
        f2b(a, b, d, i);
    }
}

void f2b(std::array<std::array<float, N>, N>& a, std::array<float, N>& b, std::array<float, N>& d, int i)
{
    float float1, float2;
    int p = i;

    float1 = fabs(a[i][i] / d[i]);

    for (int ii = (i + 1); ii < N; ii++)
    {
        float2 = fabs(a[ii][i] / d[ii]);

        if (float2 > float1)
        {
            float1 = float2;
            //11
            p = ii;
        }
    }

    if (p != i)
    {
        //2
        THE MISTAKE IS HERE, WHERE i IS WRITTEN FOR ii
        for (int ii = i; i < N; i++)
        {
            float2 = a[p][ii];
            a[p][ii] = a[i][ii];
            a[i][ii] = float2;
        }

        //2
        float2 = b[p];
        b[p] = b[i];
        b[i] = dummy;
    }

}

void f3(std::array<std::array<float, N>, N> a, std::array<float, N> b, std::array<float, N>& c)
{
    //3
    c[0] = 0;
}

1 个答案:

答案 0 :(得分:0)

这个问题是关于代码中的输入错误。虽然很难找到,但这个问题完全无趣。