c++ - 使用 GMP 的 while 循环问题
问题描述
我正在尝试使用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);”行时都会遇到问题(循环不再执行)。我将我的函数 euclid 称为 a 等于 mpz_t 33 和 b 等于 mpz_t 5。
解决方案
像这样的问题(“我添加了一个看似无关的变量/函数调用并且行为发生了神秘的变化”)几乎总是未定义行为的结果。在这种情况下,UB 在行中
mpz_inits(r1, r2);
应该是
mpz_inits(r1, r2, NULL);
(请参阅文档)。给定的列表mpz_inits
必须以 NULL 结尾,以便函数知道何时停止;否则它将覆盖随机内存。
Valgrind 是发现此类问题的宝贵工具。
推荐阅读
- c# - ASP.NET 多重绑定参数
- javascript - 使用破折号将文本转换为 url
- c# - 查询列表并选择前 10 个值
- php - redis - 将多个值添加到列表并获取多个值
- sql - 无效操作:窗口函数滞后不支持默认参数;
- messaging - Nats.io 队列,同步行为
- azure - Azure 应用服务槽 - Environment.GetEnvironmentVariable() 返回 null
- apache-kafka - 发生异常主题未找到错误代码 - 汇合
- elixir - ExUnit - 如何通过命名设置函数将上下文传递给描述块中的测试宏
- c++ - 是否可以以编程方式构造 std::initializer_list?