Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/153.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/60.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 使用GMP时出现while循环问题_C++_C_Loops_Gmp - Fatal编程技术网

C++ 使用GMP时出现while循环问题

C++ 使用GMP时出现while循环问题,c++,c,loops,gmp,C++,C,Loops,Gmp,我试图使用GMP库对扩展的欧几里德算法进行编码,因为我使用了大量的数字。我的算法是最基本的,只适用于GMP编号 但是我的while循环有问题。下面的代码是我的算法的一个可复制的例子。我只是为了测试而更改了循环的内容 void euclid(mpz_t a, mpz_t b){ mpz_t r1, r2, u1, u2, v1, v2; mpz_init_set_ui(u1, 1); mpz_init_set_ui(v1, 0); mpz_init_set_ui(u2, 0); mpz_in

我试图使用GMP库对扩展的欧几里德算法进行编码,因为我使用了大量的数字。我的算法是最基本的,只适用于GMP编号

但是我的while循环有问题。下面的代码是我的算法的一个可复制的例子。我只是为了测试而更改了循环的内容

void euclid(mpz_t a, mpz_t b){


mpz_t r1, r2, u1, u2, v1, v2;

mpz_init_set_ui(u1, 1);
mpz_init_set_ui(v1, 0);
mpz_init_set_ui(u2, 0);
mpz_init_set_ui(v2, 1);

mpz_inits(r1, r2);

mpz_set(r1, a);
mpz_set(r2, b);

while(mpz_cmp_ui(r2, 0))
{
    gmp_printf("r2 : %Zd\n", r2);
    mpz_sub_ui(r2, r2, 1);

    mpz_t q;
    mpz_init(q);
}}
循环似乎没有执行

寻找问题的根源,我试图简化循环,每当我添加行“mpz_init(q);”时,我就会遇到一个问题(循环不再执行)。我用a等于mpz_t 33,b等于mpz_t 5来调用我的函数euclid。

像这样的问题(“我添加了一个看似不相关的变量/函数调用,行为发生了神秘的变化”)几乎总是未定义行为的结果。在这种情况下,UB在线路中

mpz_inits(r1, r2);
应该是什么

mpz_inits(r1, r2, NULL);
(见附件)。给定给
mpz_inits
的列表必须以NULL结尾,以便函数知道何时停止;否则它将覆盖随机内存

Valgrind是发现此类问题的宝贵工具。

类似的问题(“我添加了一个看似无关的变量/函数调用,行为发生了神秘的变化”)几乎总是未定义行为的结果。在这种情况下,UB在线路中

mpz_inits(r1, r2);
应该是什么

mpz_inits(r1, r2, NULL);
(见附件)。给定给
mpz_inits
的列表必须以NULL结尾,以便函数知道何时停止;否则它将覆盖随机内存


Valgrind是发现此类问题的宝贵工具。

什么是
r2
?它是如何初始化的?请尝试创建一个链接来显示给我们。@Someprogrammerdude抱歉,我将编辑我的消息。r2是一个mpz_t值。我在循环之前用mpz_init(r2)初始化它的值,然后用mpz_set(r2,e)设置它的值,其中e是我函数的一个参数。如果循环似乎没有执行,那只能是因为
r2
等于
0
(这样会返回零,这是“false”)@某个程序员我同意这一点,但是添加行mpz_init(q)的简单事实使循环不再执行。没有该行,循环执行得很好。所以我不明白这一行(“mpz_init(q)”)是如何影响r2的值的。但是,它仍然是有序的,包括您添加影响结果的init行的确切位置和方式。什么是
r2
?它是如何初始化的?请尝试创建一个链接来显示给我们。@Someprogrammerdude抱歉,我将编辑我的消息。r2是一个mpz_t值。我在循环之前用mpz_init(r2)初始化它的值,然后用mpz_set(r2,e)设置它的值,其中e是我函数的一个参数。如果循环似乎没有执行,那只能是因为
r2
等于
0
(这样会返回零,这是“false”)@某个程序员我同意这一点,但是添加行mpz_init(q)的简单事实使循环不再执行。没有该行,循环执行得很好。所以我不明白这一行(“mpz_init(q)”)是如何影响r2的值的。但是,它仍然是有序的,包括您添加影响结果的init行的确切位置和方式。