Почему я получаю ошибку сегментации: 11 - PullRequest
0 голосов
/ 09 ноября 2018

Эта программа должна функционировать как калькулятор комплексных чисел. Я обязан использовать эти функции с заданными параметрами. Когда я запускаю программу, я могу ввести 4 цифры после выбора операции. Сразу после нажатия клавиши ввода на четвертом числе я получаю сообщение об ошибке «Ошибка сегментации: 11». Я не могу выяснить, почему я получаю это сообщение.

Я включил код.

#include <stdio.h>
#include <math.h>
#include <stdlib.h>

void read_num(float *real_part, float *imaginary_part) {
    float realnumberholder, imagnumberholder;
    printf("Please type in the real component: ");
    scanf("%f", &realnumberholder);
    *real_part = realnumberholder;
    printf("Please type in the imaginary component: ");
    scanf("%f", &imagnumberholder);
    *imaginary_part = imagnumberholder;
}

void read_nums(float *real_part_1, float *imaginary_part_1,
               float *real_part_2, float *imaginary_part_2)   {
    printf("Reading the first imaginary number...");
    read_num(real_part_1, imaginary_part_1);
    printf("Reading the second imaginary number...");
    read_num(real_part_2, imaginary_part_2);
}

void print_complex(float real_part, float imaginary_part) {
    printf("The operation yields %6.3f + %6.3fi", real_part,
           imaginary_part);
}

void add(float real_part_1, float imaginary_part_1, float
         real_part_2, float imaginary_part_2, float *real_result, float
         *imaginary_result) {
    read_nums(&real_part_1, &imaginary_part_1, &real_part_2,
              &imaginary_part_2);
    *real_result = (real_part_1 + real_part_2);
    *imaginary_result = (imaginary_part_1 + imaginary_part_2);
    print_complex(*real_result, *imaginary_result);
}

void subtract(float real_part_1, float imaginary_part_1, float
              real_part_2, float imaginary_part_2, float *real_result, float
              *imaginary_result) {
    read_nums(&real_part_1, &imaginary_part_1, &real_part_2,
              &imaginary_part_2);
    *real_result = (real_part_1 - real_part_2);
    *imaginary_result = (imaginary_part_1 - imaginary_part_2);
    print_complex(*real_result, *imaginary_result);
}

void multiply(float real_part_1, float imaginary_part_1, float
              real_part_2, float imaginary_part_2, float *real_result, float
              *imaginary_result) {
    read_nums(&real_part_1, &imaginary_part_1, &real_part_2,
              &imaginary_part_2);
    *real_result = (real_part_1 * real_part_2);
    *imaginary_result = (imaginary_part_1 * imaginary_part_2);
    print_complex(*real_result, *imaginary_result);
}

int main()
{
    int option;
    float realone = 0;
    float imaginaryone = 0;
    float realtwo = 0;
    float imaginarytwo = 0;
    float *realresult;
    float *imaginaryresult;


    printf("\nComplex Number Arithmetic Program.\n");
    printf("1) Add two complex numbers\n2) Subtract two complex
           numbers\n3) Multiply two complex number\n4) Quit\nChoose an
           option (1-4): ");
    scanf("%d", &option);

    while(option != 4) {

        switch(option) {
        case 1 :
            add(realone, imaginaryone, realtwo,
                imaginarytwo, realresult, imaginaryresult);
            printf("1) Add two complex numbers\n2)
                   Subtract two complex numbers\n3) Multiply
                   two complex number\n4) Quit\nChoose an
                   option (1-4): ");
            scanf("%d", &option);
            break;
        case 2 :
            subtract(realone, imaginaryone, realtwo,
                     imaginarytwo, realresult, imaginaryresult);
            printf("1) Add two complex numbers\n2)
                   Subtract two complex numbers\n3) Multiply
                   two complex number\n4) Quit\nChoose an
                   option (1-4): ");
            scanf("%d", &option);
            break;
        case 3 :
            multiply(realone, imaginaryone, realtwo,
                     imaginarytwo, realresult, imaginaryresult);
            printf("1) Add two complex numbers\n2)
                   Subtract two complex numbers\n3) Multiply
                   two complex number\n4) Quit\nChoose an
                   option (1-4): ");
            scanf("%d", &option);
            break;
        default:
            printf("Please input a valid menu
                   option\n");
            printf("1) Add two complex numbers\n2)
                   Subtract two complex numbers\n3) Multiply
                   two complex number\n4) Quit\nChoose an
                   option (1-4): ");
            scanf("%d", &option);
            break;
        }
    }

    if (option == 4) {
        printf("Bye!\n");
        return 0;
    }

}

Ответы [ 2 ]

0 голосов
/ 09 ноября 2018

Реальный результат и мнимый результат взяты как указатели на основную функцию. Они должны быть просто плавающими переменными, и вы должны передать адрес этих переменных соответствующим функциям. Измените следующие строки

float *realresult;
float *imaginaryresult;

до

float realresult;
float imaginaryresult;

Кроме того, вызовы функций должны быть изменены на

add(realone, imaginaryone, realtwo, imaginarytwo, &realresult, &imaginaryresult);
...
subtract(realone, imaginaryone, realtwo, imaginarytwo, &realresult, &imaginaryresult);
....
multiply(realone, imaginaryone, realtwo, imaginarytwo, &realresult, &imaginaryresult);
0 голосов
/ 09 ноября 2018

Изменить это

float *realresult;
float *imaginaryresult;

К этому:

float realresult;
float imaginaryresult;

Затем измените вызовы функций, взяв вместо них адрес:

add(realone, imaginaryone, realtwo,
            imaginarytwo, &realresult, &imaginaryresult);

(обратите внимание на символы &)

И это будет работать. Как и раньше, без этих выделений памяти эти два указателя не указывают ни на одну действительную память. Они неинициализированы, и доступ к ним, как и у вас, является неопределенным поведением. На практике обычно происходит то, что он пытается интерпретировать значение мусора как адрес и пытается получить доступ к этому адресу, что приводит к ошибке сегментации.

...