为什么这段代码在我的机器上显示正确的值时会显示一些垃圾类型的值?

时间:2015-04-18 07:56:33

标签: c++ runtime-error

我正在尝试编写一个用于实现Djisktra算法的代码......并且遇到了一些问题 代码的链接是Ideone ... 当在我的PC上运行相同的代码时,输​​出结果为

  

0 4 12 19 21 11 9 8 14

输出一个ideone是

  

0 4 12 19 21 11 9 8 16777230

看到最后一个元素14的区别......我对它很无能为力......我的代码中是否有错误?或者它是由于在线编译器的其他原因而发生的,还是我在做一些愚蠢的事情?

潜在错误

int find(int start)
{
    int low=INT_MAX,idx=-1,i;
    for(i=0;i<V;i++)
        if( !(Left[i]) && low>=Distances[i])
            {
                idx=i;
                low=Distances[i];
            }
    return idx;
}

while(start != -1)
{
    for(i = 0; i < V; i++)
        if(graph[start][i] && Distances[start] + graph[start][i] < Distances[i])
            Distances[i] = graph[start][i] + Distances[start];

    start = find(start);
    Left[start] = true;
}

我试过找到原因..在某个时刻V-1的距离是14(我试过打印)但是没有更新后来(我试着在V-1的距离更新时打印它)但是好像以后没有更新!! 我是初学者请告诉我哪里出错了 注意:(图形是2D邻接矩阵)距离是int类型的数组,Left是bool类型的数据)

1 个答案:

答案 0 :(得分:1)

您在ideone上的代码中的while循环中有未定义的行为,它与您在此处发布的代码不匹配。这就是为什么其他人告诫你没有提供一个最小的例子。当find返回-1时,Left[start] = true会在数组开始之前进行访问。由于它是未定义的行为,它可以做任何事情,包括在您的PC上正常工作并且在ideone上失败。要修复,因为在while循环之前有Left[start] = true,请将其删除,然后将其移到while的顶部:

while(start != -1)
{
    Left[start] = true;
    for(i = 0; i < V; i++)
        if(graph[start][i] && Distances[start] + graph[start][i] < Distances[i])
            Distances[i] = graph[start][i] + Distances[start];

    start = find(start);
}

更正ideone上的代码(也删除了一些未使用的变量)。