我已经找遍了所有的论坛来尝试和理解这个问题。我无法完全理解问题的原因以及为什么找不到解决方案是因为我对C++相当陌生,而且我不明白错误消息。完整初学者:空指针的问题?
这是我在C++中的代码,它可以从排列或组合公式中找到可能的数目。每次我尝试编译和运行,我得到消息说:
First-chance exception at 0x6a8613af (msvcr100d.dll) in Combinations_Permutations.exe: 0xC0000005: Access violation reading location 0x00000005. Unhandled exception at 0x6a8613af (msvcr100d.dll) in Combinations_Permutations.exe: 0xC0000005: Access violation reading location 0x00000005.
我已经在许多其他论坛的“访问冲突读取地址0x00 ......”肯定可以表明空指针教训。但我看不到我遇到这样一个空问题。也许我的变量正在全球访问,他们不是初始化? 这是我的代码,我一直在这里一段时间...就像我说我是相当新的。所以请告诉我我的错误。谢谢。
我的代码:
#include <iostream>
#include "conio.h";
using namespace std;
int run_combination(int n, int r);
int run_permutation(int n, int r);
int solve_factorial(int f);
int f_value = 1; //factorial value used recursively
int n_input, r_input;
char choice;
char order;
void main(){
//if user types choice as 'q', while loop ends
while(choice != 'q'){
printf("How many values? (1-9) \n");
printf("User: ");
cin >> n_input;//user input for variable n
printf("n_input: %i", n_input);
printf("\nHow many will be chosen at a time out of those values? (1-9)\n");
printf("User: ");
cin >> r_input; //user input for variable r
printf("\nDoes order matter? (y/n)\n");
printf("User: ");
cin >> order; //'y' if order is taken into consideration(permutation)
//'n' if order it NOT taken into consideration(combination)
int solution = 0; //temporary variable that represents the solution after running
//n and r through the permutation or combination formula
//if user input values for n and r are in between 1 and 9, then run
//combination or permutation
if (n_input <= 9 && n_input >= 1 && r_input <= 9 && r_input >= 1){
if (order == 'y')
solution = run_permutation(n_input, r_input);
else if (order == 'n')
solution = run_combination(n_input, r_input);
else
printf("\nError. Please type 'y' or 'n' to determine if order matters.\n");
//if n < r, run_permutation or run_combination returns 0
if (solution == 0){
printf("Error! You can't choose %i values at a time if there \n",
"are only %i total values. Type in new values next loop \n.", r_input, n_input);
}
else
printf("Number of possibilities: %s", solution);
}
else{ //else error message if numbers are out of range...
printf("Next loop, type in values that range from 1 to 9.\n");
}
//option 'q' to quit out of loop
printf("Type 'q' to quit or enter any key to continue.\n");
printf("User: ");
cin >> choice;
}
_getch();
}
/*
Returns solved combination of parameters n and r
Takes the form: n!/r!(n-r)!
*/
int run_combination(int n, int r){
if (n < r) //solution is impossible because you can't choose r amounnt at a time if r is greater than n
return 0;
int n_fac = solve_factorial(n); //n!
int r_fac = solve_factorial(r); //r!
int nMinusr_fac = solve_factorial(n-r); //(n-r)!
int solve = ((n_fac)/((r_fac)*(nMinusr_fac))); // plugging in solved factorials into the combination formula
return solve;
}
int run_permutation(int n, int r){
if (n < r)
return 0;
int n_fac = solve_factorial(n);
int nMinusr_fac = solve_factorial(n-r);
int solve = ((n_fac)/(nMinusr_fac)); //plugging in factorials into permutation formula
return solve;
}
int solve_factorial(int f){
if (f-1==0 || f == 0){ //if parameter f is 1 or 0, return 1
int temp = f_value;
f_value = 1; //reset f_value so that f_value remains 1 at the start of every new factorial
return temp;
}
else{ //else multiply f_value by f-1
f_value *= f;
return solve_factorial(f-1);
}
}
你现在可以学习如何使用调试器! – 2012-02-10 22:51:38
再说一句。混合C型函数(printf)和C++ ioclases(cin)是一种糟糕的风格。除非有必要,否则不要混用它们。如果你使用cout而不是printf,你会逃避你的错误,代码会更好看 – mikithskegg 2012-02-10 23:00:01
'main'返回一个'int'而不是'void',看到这个[SO问题](http://stackoverflow.com/questions/636829/void-main-and-int-main) – 2012-02-10 23:06:58