Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/70.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:初始化多个变量_C_Gmp - Fatal编程技术网

C GMP:初始化多个变量

C GMP:初始化多个变量,c,gmp,C,Gmp,可以将GMP变量“mpz_t n”初始化为mpz_init(n) 文档sais'void mpz_inits(mpz_t x,…)初始化以NULL结尾的mpz_t变量列表,并将其值设置为0' 我不确定这里的“空终止列表”是什么意思 mpz_t a, b, c; mpz_inits(a, b, c, NULL); 以上是初始化a、b和c的正确方法吗?是的,这是正确的 在C语言中,变量函数(如mpz_inits)没有隐式的方法来知道传递了多少个参数。不同的功能以不同的方式实现这一点。例如,*pri

可以将GMP变量“mpz_t n”初始化为mpz_init(n)

文档sais'void mpz_inits(mpz_t x,…)初始化以NULL结尾的mpz_t变量列表,并将其值设置为0'

我不确定这里的“空终止列表”是什么意思

mpz_t a, b, c;
mpz_inits(a, b, c, NULL);
以上是初始化a、b和c的正确方法吗?

是的,这是正确的

在C语言中,变量函数(如
mpz_inits
)没有隐式的方法来知道传递了多少个参数。不同的功能以不同的方式实现这一点。例如,
*printf
系列使用格式字符串来决定额外参数的数量/类型。在其他情况下,例如
mpz_inits
,它们使用空终止符来标记列表的结尾(与空字符
\0
标记字符串结尾的方式大致相同)


NULL terminated只是指长度不确定的列表的结束由
NULL
参数表示。

在C中,当原型以省略号结束时,无法检查相应参数的类型。因此,您需要确保最后一个参数的类型是正确的。在这里,由于
mpz_inits
需要指向
mpz_ptr
的指针,因此需要提供指向此类型的空指针,例如通过使用强制转换:

mpz_inits (a, b, c, (mpz_ptr) 0);


请注意,转换到另一种指针类型(如
void*
)并不能保证在所有平台上都能工作,特别是在指针类型大小不同的情况下。现在,是否存在这样的平台/GMP支持这样的平台是另一个问题。。。但其他问题也可能来自高级编译器优化。因此,这里最好严格遵循C标准。

值得注意的是,这是不可移植的。一个实现可以
#定义
NULL
0
(而不是
((void*)0)
,例如gcc被记录为这样做)。您需要
mpz_inits(a,b,c,(void*)NULL)
mpz_inits(a,b,c,(void*)0)
。只需注意一点:“mpz_inits”和“mpz_clears”出现在GMP 5.0.0中。@marglisse因为这是实际使用的类型,所以应该记录
mpz_ptr
(转换为
mpz_t
,这是为原型记录的类型,不起作用).
mpz_inits (a, b, c, (mpz_ptr) NULL);