首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >C++:调试确定,运行发行版得到错误答案

C++:调试确定,运行发行版得到错误答案
EN

Stack Overflow用户
提问于 2018-01-18 04:19:47
回答 2查看 131关注 0票数 1

我已经提取出有问题的代码,下面的代码定义了一个带有向量的2D数组。然后打印二维数组。当我使用调试模式运行它时,它会打印正确的答案,但是当我在没有调试的情况下运行它时(即。释放模式)。有时它打印整个2D数组,有时打印一部分,然后退出,没有任何消息。为什么会发生这种事?谢谢你!

运行环境:

代码语言:javascript
复制
 Windows 10 version: 10.0.16299.125
代码语言:javascript
复制
 Clion 2017.3
代码语言:javascript
复制
 Mingw64 5.0  

狮子座的CmakeLists.txt:

代码语言:javascript
复制
 cmake\_minimum\_required(VERSION 3.8)
代码语言:javascript
复制
 project(Test)
代码语言:javascript
复制
 set(CMAKE\_CXX\_STANDARD 11)
代码语言:javascript
复制
 set(SOURCE\_FILES main.cpp)
代码语言:javascript
复制
 add\_executable(Test ${SOURCE\_FILES})
代码语言:javascript
复制
#include <vector>
#include <iostream>

using namespace std;

int main()
{
    vector<vector<int>> graph{{0, 4,  0, 0,  0,  0,  0, 8,  0},
                              {4, 0,  8, 0,  0,  0,  0, 11, 0},
                              {0, 8,  0, 7,  0,  4,  0, 0,  2},
                              {0, 0,  7, 0,  9,  14, 0, 0,  0},
                              {0, 0,  0, 9,  0,  10, 0, 0,  0},
                              {0, 0,  4, 14, 10, 0,  2, 0,  0},
                              {0, 0,  0, 0,  0,  2,  0, 1,  6},
                              {8, 11, 0, 0,  0,  0,  1, 0,  7},
                              {0, 0,  2, 0,  0,  0,  6, 7,  0}};


    for(int i = 0; i < graph.size(); i++)
    {
        for(int j = 0; j < graph[i].size(); j++)
        {
            cout  << i << "-" << j  << ": "<< graph[i][j] << endl;
        }
        cout << endl;
    }
    return 0;
}

输出不稳定,有时成功,有时失败,下面是两个错误的输出第一个错误的输出:

代码语言:javascript
复制
E:\coding\LCCPP\Test\cmake-build-debug\Test.exe
0-0: 0
0-1: 4
0-2: 0
0-3: 0
0-4: 0
0-5: 0
0-6: 0
0-7: 8
0-8: 0

1-0: 4
1-1

1-1:
Process finished with exit code 0

第二个错误输出:

代码语言:javascript
复制
E:\coding\LCCPP\Test\cmake-build-debug\Test.exe
0-0: 0
0-1: 4
0-2: 0
0-3: 0
0-4: 0
0-5: 0
0-6: 0
0-7: 8
0-8: 0

1-0: 4
1-1: 0
1-2: 8
1-3: 0
1-4: 0
1-5: 0
1-6: 0
1-7: 11
1-8: 0

2-0: 0
2-1: 8
2-2: 0
2-3: 7
2-4: 0
2-5: 4
2-6: 0
2-7: 0
2-8: 2

3-0: 0
3-1: 0
3-2: 7
3-3: 0
3-4: 9
3-5: 14
3-6: 0
3-7: 0
3-8: 0

4-0: 0
4-1: 0
4-2: 0
4-3: 9
4-4: 0
4-5: 10
4-6: 0
4-7: 0
4-8: 0

5-0: 0
5-1: 0
5-2: 4
5-3: 14
5-4: 10
5-5: 0
5-6: 2
5-7: 0
5-8: 0

6-0: 0
6-1: 0
6-2: 0
6-3: 0
6-4: 0
6-5: 2
6-6: 0
6-7: 1
6-8: 6

7-0: 8
7-1: 11
7-2: 0
7-3: 0
7-4: 0
7-5: 0
7-6: 1
7-7: 0
7-8: 7

8-0: 0
8-1: 0
8-2: 2
8-3: 0
8-4: 0
8-5: 0
8
Process finished with exit code 0

正确的产出:

代码语言:javascript
复制
E:\coding\LCCPP\Test\cmake-build-debug\Test.exe
0-0: 0
0-1: 4
0-2: 0
0-3: 0
0-4: 0
0-5: 0
0-6: 0
0-7: 8
0-8: 0

1-0: 4
1-1: 0
1-2: 8
1-3: 0
1-4: 0
1-5: 0
1-6: 0
1-7: 11
1-8: 0

2-0: 0
2-1: 8
2-2: 0
2-3: 7
2-4: 0
2-5: 4
2-6: 0
2-7: 0
2-8: 2

3-0: 0
3-1: 0
3-2: 7
3-3: 0
3-4: 9
3-5: 14
3-6: 0
3-7: 0
3-8: 0

4-0: 0
4-1: 0
4-2: 0
4-3: 9
4-4: 0
4-5: 10
4-6: 0
4-7: 0
4-8: 0

5-0: 0
5-1: 0
5-2: 4
5-3: 14
5-4: 10
5-5: 0
5-6: 2
5-7: 0
5-8: 0

6-0: 0
6-1: 0
6-2: 0
6-3: 0
6-4: 0
6-5: 2
6-6: 0
6-7: 1
6-8: 6

7-0: 8
7-1: 11
7-2: 0
7-3: 0
7-4: 0
7-5: 0
7-6: 1
7-7: 0
7-8: 7

8-0: 0
8-1: 0
8-2: 2
8-3: 0
8-4: 0
8-5: 0
8-6: 6
8-7: 7
8-8: 0


Process finished with exit code 0
EN

回答 2

Stack Overflow用户

发布于 2018-01-18 06:42:15

代码没有实际问题,可能是IDE不提供输出的问题。实际上,在控制台中打印整个管道缓冲区之前,程序就会退出。当子进程退出时,管道被关闭,没有任何错误,父进程没有任何打印。如果在结束时暂停程序会发生什么情况?

虽然在非空函数中不提供“返回”是不好的,但是mingw将等效的return 0;添加到main().

PS:考虑使用range-fors:

代码语言:javascript
复制
int main()   
{
    using namespace std;
    vector<vector<int>> graph{{0, 4,  0, 0,  0,  0,  0, 8,  0},
                              {4, 0,  8, 0,  0,  0,  0, 11, 0},
                              {0, 8,  0, 7,  0,  4,  0, 0,  2},
                              {0, 0,  7, 0,  9,  14, 0, 0,  0},
                              {0, 0,  0, 9,  0,  10, 0, 0,  0},
                              {0, 0,  4, 14, 10, 0,  2, 0,  0},
                              {0, 0,  0, 0,  0,  2,  0, 1,  6},
                              {8, 11, 0, 0,  0,  0,  1, 0,  7},
                              {0, 0,  2, 0,  0,  0,  6, 7,  0}};


    for(auto &line: graph)
    {
        int i = 0, j= 0;
        for(auto v : line )
        {
            cout  << i << "-" << j  << ": "<< v << endl;
            j++;
        }
        i++;
        cout << endl;
    }
    return 0;
}

( http://en.cppreference.com/w/cpp/language/range-for )

票数 0
EN

Stack Overflow用户

发布于 2018-01-18 07:03:13

也许可以通过添加std::flush来检查这个解决方案

代码语言:javascript
复制
for(auto v : line )
{
    cout  << i << "-" << j  << ": "<< v << endl << flush;
    j++;
}

它将“强制”所有输出。顺便说一下,在我看来,这是一些代码优化的问题。

票数 -1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/48313786

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档