多维数组不会更新(C ++)

时间:2014-04-12 15:24:47

标签: c++ visual-studio-2012 multidimensional-array

我实施了Bellman-Kalaba的算法,用于在图表中找到从顶点1到任何其他道路的最大道路值。 问题是(虽然很傻),第二个二维数组 matriceaDrumurilorMaxime [20] [20] 在函数中作为参数传递,不会改变任何值 ,即使我确实给它赋值,或者从另一个赋值给它。我从文件初始化第一个数组 matriceaValorilor [20] [20] ,它工作正常。第二个数组刚刚初始化为0,正如你在main函数中看到的那样。我使用Visual Studio 2012,也许这是一个IDE问题?也许有人也有这个问题,可以帮助我一点......

void bellmanKalaba(int matriceaValorilor[20][20], int dim, int matriceaDrumurilorMaxime[20][20], int &linii, int &coloane)
{
    linii = 1;
    coloane = dim;
    for(int j = 0; j < dim; j++)
    {
        matriceaDrumurilorMaxime[0][j] = matriceaValorilor[j][dim-1];
    }

    bool sfarsit = false;
    while(sfarsit != true)
    {   
        for(int poz = 0; poz < coloane; poz++)
        {
            int valMax = 0;
            for(int j = 0; j < coloane; j++)
            {
                if( matriceaDrumurilorMaxime[linii-1][j] + matriceaValorilor[poz][j] > valMax )
                    valMax = matriceaDrumurilorMaxime[linii-1][j] + matriceaValorilor[poz][j];
            }
            matriceaDrumurilorMaxime[linii][poz] = valMax;
        }
        sfarsit = true;
        int k = 0;
        while(sfarsit == true)
        {
            if(matriceaDrumurilorMaxime[linii][k] != matriceaDrumurilorMaxime[linii-1][k])
                sfarsit = false;
            ++k;
        }
        ++linii;
    }
}

void citireMatriceaValorilorDinFisier(int matriceaValorilor[20][20], int &dimensiune, char* numefisier)
{
    int i = 0, j = 0;
    dimensiune = 0;
    ifstream file(numefisier);
    string line;
    string element;
    size_t pos = 0;
    string delimiter = " ";

    while(getline(file,line))
    {
        ++dimensiune;
        while(pos = line.find(delimiter, 0) != string::npos)
        {
            pos = line.find(delimiter, 0);
            element = line.substr(0,pos);
            matriceaValorilor[i][j] = atoi(element.c_str());
            line.erase(0, pos+delimiter.length());
            ++j;
        }
        ++i;
        j = 0;
    }
    file.close();
}

int main()
{
    cout << "===Problema ordonantarii: graful potentiale etape===" << endl << endl << endl;
    int varfuri = 0;
    int matriceValorilor[20][20] = {0};
    citireMatriceaValorilorDinFisier( matriceValorilor, varfuri, "Graf.txt");
    cout << "Matricea valorilor arcelor:" << endl;
    afisareMatrice( matriceValorilor, varfuri, varfuri );

    int linii, coloane;
    int matriceaDrumurilorMaxime[20][20] = {0};

    bellmanKalaba(matriceValorilor, varfuri, matriceaDrumurilorMaxime, linii, coloane);
    cout << "Matricea valorilor maxime ale drumurilor de la varful 1 la celelalte varfuri:" << endl;
    afisareMatrice( matriceaDrumurilorMaxime, linii, coloane );

    //int dimensiune;
    //int drumMax[20];
    //puncteCritie(matriceaDrumurilorMaxime, varfuri, matriceaDrumurilorMaxime, linii, coloane, drumMax, dimensiune);
    //cout << "Punctele critice ale grafului potentiale etape:" << endl;
    //afisareVector(drumMax, dimensiune);

    cin.get();
    return 0;
}

1 个答案:

答案 0 :(得分:0)

我不确定这是否是您的主要问题,但bellmanKabala中存在逻辑错误。

循环开始while(sfarsit != true)永远无法完成。这是因为它包含从while(sfarsit==true)开始的循环。内循环运行直到设置sfarsit = false。但这意味着外部循环将再次运行,并且没有其他break语句或任何内容。

最终linii将溢出数组的边界并导致未定义的行为。

除了修复此错误之外,您还可以在++linii之后添加一个检查if (linii >= dim)然后中止并打印错误消息,表明出现了问题;而不只是溢出缓冲区。内部循环还应该检查k < dim