程序似乎在 for 循环后静默终止 - C++

Posted

技术标签:

【中文标题】程序似乎在 for 循环后静默终止 - C++【英文标题】:Program seems to silently terminate after for-loop - C++ 【发布时间】:2018-03-04 22:38:14 【问题描述】:

我创建了一个程序,它打印出通过命令行参数提供的所有字符排列,并决定将执行时间与用 Java 编写的等效程序进行比较。

该程序一直运行,直到我决定多次查找排列以获得平均执行时间。

void avgTime(char**& argv, int times) 
    if (sizeof(argv) > 1) 

        long permutationAmnt;

        clock_t s_start, s_end, t_start, t_end;
        float s_runms, t_runms;

        long avg_time;

        for (int count = 0; count < times; count++) 

            t_start = clock();

            for (int i = 1; i < sizeof(argv); i++) 
                s_start = clock();
                permutationAmnt = permutations(std::string(argv[i]));
                s_end = clock();

                s_runms = ((float)s_end - s_start) / CLOCKS_PER_SEC * 1000;
                std::cout << "SUCCESS (" << s_runms << "ms for " << permutationAmnt << " permutations)" << std::endl << std::endl;
            

            t_end = clock();

            t_runms = ((float) t_end - t_start) / CLOCKS_PER_SEC * 1000;
            std::cout << std::endl << "TOTAL RUNTIME: " << t_runms << "ms" << std::endl;
            avg_time += t_runms;
        

        std::cout << "AVERAGE RUNTIME: " << avg_time / times << "ms" << std::endl;
    


int main(int argc, char** argv) 
    avgTime(argv, 10);
    return 0;

avgTime() 中的第一个 for 循环仅执行一次(将 cout 放入其中仅打印一次),并且在嵌套的 for 循环中断后程序似乎终止。

我不确定问题出在avgTime() 中的某些代码上,还是来自某个辅助函数,例如permute()。无论哪种方式,这里都是每个辅助函数以及包含的代码(p.s. num 在任何函数之外声明)。

/*
* Calls the recursive permute() function then
* returns the total amount of permutations possible
* for the given input.
*
* NOTE: the num variable is used in the permute() function
* for numbering the permutations printed as output (see next function
* for clarificiation)
*/
long permutations(const std::string& arg) 
    long totalPermutations = factorial(arg.size()); //self-explanatory

    num = 1;
    permute(arg, 0);

    return totalPermutations;



/*
 * Recursively prints out each permutation
 * of the characters in the argument, str
 */
void permute(const std::string& str, int place) 
    if (place == str.size() - 1) std::cout << ((num <= 10) ? "0" : "") << num++ << ". " << str << std::endl;

    for (int i = place; i < str.size(); i++) 
        permute(swap(place, i, str), place + 1); //self-explanatory
    


long factorial(int num) 
    if (num < 2) 
        return 1;
    
    return factorial(num - 1) * num;


std::string swap(int i, int j, const std::string& str) 
    std::string s(str);
    s[i] = s[j];
    s[j] = str[i];
    return s;

注意:permute() 函数出现在源代码中的 permutation() 函数之前,并且对它的所有必要调用者可见。

//Includes and namespace stuff
#include <iostream>
#include <string>
#include <time.h>

如果您希望我提供任何其他信息,请告诉我,如果您能提供任何帮助,我将不胜感激。再次感谢您的帮助。

附:不,这不是家庭作业:P

编辑:删除 using namespace std; 并相应地调整代码以避免函数 std::swap() 和我自己的 swap() 函数之间的混淆。此外,添加了swap()factorial() 函数以避免任何歧义。对于由此造成的混乱,我深表歉意。

【问题讨论】:

//Self-explanatory - 我喜欢这样的cmets std::cout 几乎会使任何性能测试变得毫无意义。你应该避免using namespace std; 嗨@George,我进行了编辑,所以它更清晰。 @lakeweb 是的,我现在意识到std::cout 会让我的任何结果都变得毫无价值。尽管如此,我仍然对导致问题的原因感兴趣。另外,关于using namespace,回避的原因是什么?我从不在任何头文件中使用namespace std,因为我知道它会泄漏到#includes 的任何其他文件中。还有更多为什么应该避免它?我会停止这样做,我只是想知道这样做是否有任何更有害的副作用。 for (int i = 1; i &lt; sizeof(argv); i++) 不会做你想做的事。 main 的 argc 参数告诉您在命令行上传递了多少参数并存储在 argv 中。用那个。这也是学习使用调试器的好时机,这样您就可以看到程序失败的地方。就您的示例而言,最好去掉示例中不需要的所有详细 cmets,将它们全部放在一个文件中,然后将它们全部发布在一个代码块中。由于您没有包含factorial(),因此您的程序无法被其他人测试。 【参考方案1】:

我使用的是sizeof(argv) 而不仅仅是argc。切换到后一个选项解决了这个问题。

【讨论】:

机智。 std::cout 可能会使用比您的代码更多的资源,并且是不可预测的。 Java 的控制台输出可能完全不同。在操作系统与服务和其他应用程序共享处理器资源的机器上计时也会严重扭曲事情。你不能使用自己的时钟。使用带有时间诊断功能的开发工具。 @lakeweb 感谢您的所有意见。我将不再使用该程序进行任何有意义的数据分析,只会将其视为学习目的。对于我将来创建的任何应用程序,我都会记住您的建议。

以上是关于程序似乎在 for 循环后静默终止 - C++的主要内容,如果未能解决你的问题,请参考以下文章

如何调试意外以静默方式终止的 win32 进程?

(iOS) GCM 静默推送通知以在应用程序终止时触发调用另一个 API

当应用程序在objective.c中终止时,我可以处理“静默通知”吗? [关闭]

当应用程序处于终止状态时,iOS 静默推送通知不会收到

为啥我在 iOS 13 中的应用程序在被用户终止时通过静默推送在后台唤醒

使用空的 for 循环有啥问题吗?