Как исправить код, который работает с одними значениями, но не с другими - PullRequest
0 голосов
/ 22 октября 2019

когда я ввожу некоторые значения, я получаю ответ, а другие значения нет, система остается заблокированной

int pgcdfon(mpz_t a, mpz_t b, mpz_t *x, mpz_t *y) {
    if (mpz_cmp_ui(a, 0) == 0) {
        mpz_set_ui(*x, 0);
        mpz_set_ui(*y, 1);
        return b;
    }
    mpz_t x1, y1, res, h;
    mpz_init(x1);
    mpz_init(y1);
    mpz_init(res);
    mpz_t o;
    mpz_init(o);
    mpz_init(h);
    mpz_mod(res, b, a);
    int pgcd = pgcdfon(res, a, &x1, &y1);
    mpz_div(o, b, a);
    mpz_mul(h, o, x1);
    mpz_sub(*x, y1, h);
    mpz_set(*y, x1);
    return pgcd;
}

void main() {
    mpz_t x, y, q, w, g;
    mpz_init(x);
    mpz_init(y);
    mpz_init(q);
    mpz_init(w);
    mpz_init(g);
    gmp_printf("donner q \n ");
    gmp_scanf("%Zd", &q);
    gmp_printf("donner w \n");
    gmp_scanf("%Zd", &w);
    mpz_set(g, (pgcdfon(q, w, &x, &y)));
    gmp_printf("\n\n pgcd  de (%Zd, %Zd) = %Zd  \n\n", q, w, g);
}

1 Ответ

1 голос
/ 22 октября 2019

Тип mpz_t является (замаскированным) типом массива и, следовательно, не может быть возвращен из функции. Вы должны изменить прототип своей функции, чтобы она возвращала значение в параметре out, а не возвращала его. Это означает, что такая функция, как

mpz_t myfun (...) {
     mpz_t ret;
     mpz_init(ret);

     // fill ret with someting

     return ret;
}

, не может работать, но ее необходимо переписать следующим образом:

void myfun (..., mpz_t *out) {
     mpz_t ret;
     mpz_init(ret);

     // fill ret with stuff
     mpz_init(*out); // if not initialized by caller
     mpz_set(*out, ret);
}

Этот метод, примененный к вашей функции, дает

void pgcdfon(mpz_t a, mpz_t b, mpz_t *x, mpz_t *y, mpz_t *ret) {
    if (mpz_cmp_ui(a, 0) == 0) {
        mpz_set_ui(*x, 0);
        mpz_set_ui(*y, 1);
        mpz_init(*ret);
        mpz_set(*ret, b);
        return;
    }
    mpz_t x1, y1, res, h;
    mpz_init(x1);
    mpz_init(y1);
    mpz_init(res);
    mpz_t o;
    mpz_init(o);
    mpz_init(h);
    mpz_mod(res, b, a);
    mpz_t pgcd;
    pgcdfon(res, a, &x1, &y1, &pgcd);
    mpz_div(o, b, a);
    mpz_mul(h, o, x1);
    mpz_sub(*x, y1, h);
    mpz_set(*y, x1);
    mpz_init(*ret);
    mpz_set(*ret, pgcd);
}

int main() {
    mpz_t x, y, q, w, g;
    mpz_init(x);
    mpz_init(y);
    mpz_init(q);
    mpz_init(w);
    mpz_init(g);
    gmp_printf("donner q \n ");
    gmp_scanf("%Zd", &q);
    gmp_printf("donner w \n");
    gmp_scanf("%Zd", &w);
    pgcdfon(q, w, &x, &y, &g);
    gmp_printf("\n\n pgcd  de (%Zd, %Zd) = %Zd  \n\n", q, w, g);
}

который должен работать, как вы ожидаете.

...