C 如何修复使用某些值但不使用其他值的代码

C 如何修复使用某些值但不使用其他值的代码,c,gmp,C,Gmp,当我输入一些值时,我得到了答案,但其他值为否,系统将保持阻塞状态 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_in

当我输入一些值时,我得到了答案,但其他值为否,系统将保持阻塞状态

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);
}

类型
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);
}

哪些应该像您期望的那样工作。

什么值?预期的输入和输出是什么?我刚刚试着编译了这个,得到了4个警告。尝试修复这些问题,至少修复返回类型警告。(<代码> PGCDFON<代码>定义为返回<代码> int <代码>,但实际上返回一个<代码> MPZYT > @ FieliCKLeZulCoLa,我是GMP的新手,所以我尝试将int转换成MPZYT,但是它不正确,所以我真的不知道该怎么办,我最后添加了一个明确的地方,但是C++接口(GMPX.H,MPZI类)也是一样的问题。对于不知道自己在做什么的初学者来说,它更容易使用。对于参数,没有理由使用
mpz\u t*
,只需将它们作为
mpz\u t
传递即可。如果要区分输入参数,可以将它们作为
const mpz_t
@marglisse传递。如果*不存在,它可能会给我错误的结果,因为在中使用函数时不会交换值main@Zineb如果您检查文档,您将看到
void mpz_add(mpz_t rop,const mpz_t op1,const mpz_t op2)
其中
rop
是输出。这个提示对你来说够了吗?@Ctx我需要帮助,我如何才能把它翻译成GMP?这是c语言中的一个函数,我需要设置这个变量。void Bezout(int-rkm2,int-rkm1,int-ukm1=0,int-vkm1=1,int-ukm2=1,int-vkm2=0)