程序似乎在 for 循环后静默终止 - C++
Program seems to silently terminate after for-loop - C++
我创建了一个程序,打印出通过命令行参数提供的所有字符排列,并决定将执行时间与用 Java.[=24= 编写的等效程序进行比较]
该程序一直有效,直到我决定多次查找排列以获得平均执行时间。
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.S。不,这不是家庭作业 :P
编辑:删除了 using namespace std;
并相应地调整了代码以避免函数 std::swap()
和我自己的 swap()
函数之间的混淆。此外,添加了 swap()
和 factorial()
函数以避免任何歧义。对于由此造成的混乱,我深表歉意。
我使用的是 sizeof(argv)
而不是 argc
。切换到后一个选项解决了这个问题。
我创建了一个程序,打印出通过命令行参数提供的所有字符排列,并决定将执行时间与用 Java.[=24= 编写的等效程序进行比较]
该程序一直有效,直到我决定多次查找排列以获得平均执行时间。
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.S。不,这不是家庭作业 :P
编辑:删除了 using namespace std;
并相应地调整了代码以避免函数 std::swap()
和我自己的 swap()
函数之间的混淆。此外,添加了 swap()
和 factorial()
函数以避免任何歧义。对于由此造成的混乱,我深表歉意。
我使用的是 sizeof(argv)
而不是 argc
。切换到后一个选项解决了这个问题。