Нарушение сегмента (генерируется «ядро») с использованием библиотеки GMP - PullRequest
1 голос
/ 28 апреля 2020

как дела? Я пытаюсь научиться использовать Multi Precision Library GMP на C ++. Вот мой код:

#include <iostream>
#include <cstdlib>
#include <gmpxx.h>
using namespace std;

int main(){

    mpf_set_default_prec (128);
    double a = 2., b = 3.;
    mpf_t x, y, z;

    mpf_set_d(x, a);
    mpf_set_d(y, b);

    mpf_div(z, x, y);

    gmp_printf("%.*Ff \n", 30, z);

    mpf_clear (x);
    mpf_clear (y);
    mpf_clear (z);

    return 0;
}

Это компилируется правильно, но при выполнении возвращает нарушение сегмента (генерируется «ядро»). Где ошибка?

1 Ответ

1 голос
/ 28 апреля 2020

mpf_t - это тип поплавка C, используемый GMP. Как сказано в документации , «объект mpf_t должен быть инициализирован перед сохранением в нем первого значения». Так что вы должны сделать:

#include <iostream>
#include <cstdlib>
#include <gmpxx.h>
using namespace std;

int main(){

    mpf_set_default_prec (128);
    double a = 2., b = 3.;
    mpf_t x, y, z;
    mpf_init(x);
    mpf_init(y);
    mpf_init(z);

    mpf_set_d(x, a);
    mpf_set_d(y, b);

    mpf_div(z, x, y);

    gmp_printf("%.*Ff \n", 30, z);

    mpf_clear (x);
    mpf_clear (y);
    mpf_clear (z);

    return 0;
}

Однако, если вы используете C ++, вы можете рассмотреть возможность использования C ++ интерфейса библиотеки, что спасет вас от вызовов init и clear.

...