visual studio 2012-多维数组不会更新(C++)

visual studio 2012 - Multidimensional array wont update ( C++ )

本文关键字:更新 C++ 数组 studio 2012- visual      更新时间:2023-10-16

我实现了Bellman-Kalaba的算法,用于在图中找到从顶点1到任何其他顶点的道路的最大值。问题是(虽然很傻),作为函数中的参数传递的第二个二维数组matrixaDrumurilorMaxime[20][20]不会更改任何值,即使我确实为它赋值,或者从另一个数组为它赋值。我确实从文件中初始化了第一个数组matrixaValorilor[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;
}

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

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

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

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