-1

I have looking all over forums to try and understand this issue. The reasons I cannot fully understand the issue and why I cannot find a solution is because I am fairly new with C++ and I do not understand the error message.

This is my code in C++ that finds the number of possibilities from permutation or combination formulas. Every I try and compile and run, I get messages that say:

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.

I've learned on many other forums that the "access violation reading location 0x00..." could definitely indicate null pointer. But I cannot see where I encounter such a null issue. Maybe my variables are being accessed globally, where they are not YET initialized? Here is my code, I have been at it for a while... like I said I'm fairly new. So please inform me of my mistake(s). Thank you.

My code:

    #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);
    }
}
  • 3
    You now get to learn how to use the debugger! – Brian Roach Feb 10 '12 at 22:51
  • 3
    One more remark. Mixing C-type functions (printf) and C++ ioclases (cin) is a bad style. Don't mix them except of a great necessity. If you used cout instead of printf you would escape your error and the code would look out much better – mikithskegg Feb 10 '12 at 23:00
  • 2
    `main` returns an `int` not `void`, see this [SO question](http://stackoverflow.com/questions/636829/difference-between-void-main-and-int-main) – Jesse Good Feb 10 '12 at 23:06
  • In general you will want to avoid posting a wall of code like that. You should spend some time narrowing the problem down into a small test case that reproduces the problem. During the course of this exercise it is likely you will find the mistake yourself. Just start removing or commenting out code until the problem goes away. Or step through the code with a debugger. Good luck and happy programming. – Brian Neal Feb 11 '12 at 01:07

2 Answers2

5

This is a mistake:

printf("Number of possibilities: %s", solution);

solution is an int, not a null terminated string: use %d.

Using std::cout which is typesafe, instead of printf(), would have prevented this error:

std::cout << "Number of possibilities: " << solution;
hmjd
  • 120,187
  • 20
  • 207
  • 252
1

The problematic line is:

printf("Number of possibilities: %s", solution);

You're telling printf that solution is a char*, and so it tries to dereference (char*)solution to print the contents of the "C-string" (presumably when solution has the value 5 in the case of your particular error message).

Change %s to %d, or use std::cout instead of printf to gain type-safety and avoid this sort of issue in the first place.

ildjarn
  • 62,044
  • 9
  • 127
  • 211