Тип 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);
}
который должен работать, как вы ожидаете.