【问题标题】:Code not working in Visual Studio 2017 but works in VS code代码在 Visual Studio 2017 中不起作用,但在 VS 代码中起作用
【发布时间】:2020-06-09 08:00:24
【问题描述】:

我正在为我的算法类编写一个项目,我需要它在 Visual Studio 2017 上工作。当我通过命令行使用 g++ 编译它时一切正常,但是当我尝试通过 VS 2017 启动程序时它进入这个函数中的无限循环(它是dinic最大流量算法的一部分):

bool Graph::BFS(int s, int t)
{
    for (int i = 0; i < V; i++)
        level[i] = -1;

    level[s] = 0; // Level of source vertex

    list<int> q;
    q.push_back(s);

    vector<Edge>::iterator i;
    while (!q.empty())
    {
        int u = q.front();
        q.pop_front();
        for (i = adj[u].begin(); i != adj[u].end(); i++)
        {
            Edge &e = *i;
            if (level[e.v] < 0 && e.flow < e.C)
            {
                // Level of current vertex is, level of parent + 1 
                level[e.v] = level[u] + 1;

                q.push_back(e.v);
            }
        }
    }
    // IF we can not reach to the sink we return false else true
    return level[t] < 0 ? false : true;
}

在while循环中。

我该如何修复它?有没有人经历过这样的事情?

提前致谢!

【问题讨论】:

  • 是的,在环境中工作但在另一个环境中不工作的错误代码非常常见。您没有提供足够的信息来诊断错误,但是您正在进行大量数组/向量访问,我希望其中一个超出范围。
  • @john 是极客的算法形式极客:geeksforgeeks.org/dinics-algorithm-maximum-flow
  • 你能找到其中的错误吗?
  • 就像@john 说的你没有提供足够的信息。例如什么是 s 和 t 值?尝试使用调试器并查看此函数中的值,因为从您提供的链接中我可以看到这只是算法中间的一个函数
  • @Paweł OK 我已经找到问题所在了,geeksforgeeks 的名声不好,这里有一个例子

标签: c++ visual-studio visual-studio-code breadth-first-search


【解决方案1】:

上述代码所源自的 geeksforgeeks site 存在漏洞。错误在Graph::DinicMaxflow 方法中。代码假设在这一行

int *start = new int[V+1];

start 数组将被初始化为零,但 C++ 不保证这一点。它会被一些编译器而不是其他编译器初始化为零。 Visual Studio 不会将此数组初始化为零,但显然您在 VSCode 后面使用的任何编译器都会这样做。

为了保证零初始化,将上面的行改为这个

int *start = new int[V+1]{}; 

【讨论】:

  • 或者只使用std::vector&lt;int&gt; start(V+1),它将所有元素初始化为零。通常,不应信任使用 new[ ] 的代码。
  • @MSalters 我刚刚注意到,不仅原始代码有问题,而且风格很差,而且它也永远不会释放分配的内存。难以置信。
猜你喜欢
  • 2019-06-23
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-02-22
  • 1970-01-01
  • 2016-09-15
  • 2017-07-11
  • 2018-02-07
相关资源
最近更新 更多