Hello, OnlineGDB Q&A section lets you put your programming query to fellow community users. Asking a solution for whole assignment is strictly not allowed. You may ask for help where you are stuck. Try to add as much information as possible so that fellow users can know about your problem statement easily.

segmentation fault error (calculator using separate function for everything)

–3 votes
asked Sep 30, 2019 by annonymous
#include<stdio.h>

#include<math.h>

void getValue(int *number1, int *number2);

int addition(int number1, int number2);

int subtract(int number1, int number2);

int multiply(int number1, int number2);

int divide(float number1, float number2);

void result();

   int main(){

   int number1, number2, add, sub, multiple, divi, choice;

   printf("[0] Exit\v[1] Add\v[2] Subtract\v[3] Multiply\v[4] Divide\n");

   scanf("%d", &choice);

switch(choice){

    case 0:

return 0;

break;

     case 1:

getValue(&number1, &number2);

        add=addition(number1,number2);

result(&add);

        break;

    case 2:

getValue(&number1, &number2);

        sub=subtract(number1,number2);

result(&sub);

        break;

    case 3:

getValue(&number1, &number2);

        multiple=multiply(number1,number2);

result(&multiple);

        break;

    case 4:

getValue(&number1, &number2);

        divi=divide(number1,number2);

result(&divi);

        break;

    default:

        printf("That is not a valid choice.");

        break;

}

}

void getValue(int *number1, int *number2 )

{

  printf("\nenter the number1=");

  scanf("%d",number1);

  printf("\nenter the number2=");

  scanf("%d",number2);

}

int addition(int number1, int number2 )

{

  int sum;

  sum=number1+number2;

  return sum;

}

int subtract(int number1, int number2 )

{

  int diff;

  diff=number1-number2;

  return diff;

}

int multiply(int number1, int number2 )

{

  int product;

  product=number1-number2;

  return product;

}

int divide(float number1, float number2 )

{

  float divison;

  divison=number1/number2;

  return divison;

}

void result(int *add, int *sub, int *multiple, float *divi)

{

printf("\n sum is=%d",*add);

printf("\n sub is=%d",*sub);

printf("\n multiple is=%d",*multiple);

printf("\n divi is=%f",*divi);

}

1 Answer

0 votes
answered Oct 21, 2019 by gameforcer (2,990 points)

*sigh* Okay, here we go.

Main reason for segmentation fault here was your result function. When you called it you passed only one argument while definiton of your function expected many more. Declaration of result differed from its definition as well which was extra confusing. What's more even when function would get called successfully it still would have printed garbage because other operation values weren't computed. For example - if user chose addition, then sub, multiple and divi wouldn't have their values set because their functions were never called in the first place.

To fix this result function should print result of only and exactly one operation.

Besides that results of operations were returned with the type of integer (int) which would be fine in some cases but it is unacceptable for division and operations with fractions. Instead, float or double should be used.

Import of math.h wasn't neccessary so I removed it as well as vertical tabs in your menu since they look kinda ugly. Anyways, here's revised code of your program:

#include <stdio.h>

void getValue(float *number1, float *number2);
float addition(float number1, float number2);
float subtract(float number1, float number2);
float multiply(float number1, float number2);
float divide(float number1, float number2);
void result(float *value, char *message);

char* msg[] = {
    "sum",
    "sub",
    "multiple",
    "divi",
};

int main()
{
   float number1, number2, res;
   int choice = 0;
   printf("[0] Exit\n[1] Add\n[2] Subtract\n[3] Multiply\n[4] Divide\n");
   scanf("%d", &choice);

    switch(choice)
    {
        case 0:
            return 0;
     
        case 1:
            getValue(&number1, &number2);
            res = addition(number1,number2);
            break;

        case 2:
            getValue(&number1, &number2);
            res = subtract(number1,number2);
            break;

        case 3:
            getValue(&number1, &number2);
            res = multiply(number1,number2);
            break;

        case 4:
            getValue(&number1, &number2);
            res = divide(number1,number2);
            break;

        default:
            printf("That is not a valid choice.");
            return 0;
    }
    result(&res, msg[choice - 1]);
    
    return 0;
}


void getValue(float *number1, float *number2)
{
    printf("\nenter the number1 = ");
    scanf("%f",number1);
    printf("enter the number2 = ");
    scanf("%f",number2);
}

float addition(float number1, float number2)
{
    return number1 + number2;
}

float subtract(float number1, float number2)
{
    return number1 - number2;
}

float multiply(float number1, float number2)
{
    return number1 * number2;
}

float divide(float number1, float number2)
{
    return number1 / number2;
}

void result(float *value, char *message)
{
    printf("\n%s is = %.2f",message, *value);
}

Welcome to OnlineGDB Q&A, where you can ask questions related to programming and OnlineGDB IDE and and receive answers from other members of the community.
...