从一个函数返回mpz_t

5

我在使用C++中的mpir库时遇到了问题。是否可以从函数中返回mpz_t值?当我尝试这样做时,出现以下错误:

RSA.cpp:50:36: error: ‘HASHtemp’ declared as function returning an array
mpz_t RSA::HASHtemp( mpz_t message )

mpz_t 类型添加别名,或者关联 class/struct/union/enum,这样没有经验的人也可以很好地回答这个问题。仅供参考。 - cadaniluk
GMP调用约定旨在禁止此操作。相反,将“返回值”作为额外参数传递。 - Tavian Barnes
1
例如:https://gmplib.org/manual/Integer-Arithmetic.html - Tavian Barnes
谢谢,但我不明白为什么文档中有声称返回mpz_t的函数声明。 - adn
1
@adn:没有。有几个宏被记录为返回“mpz_t”结果。 - Keith Thompson
你可以尝试将值作为char*返回,并在返回时重新分配它们。 - Redsam121
1个回答

5
不,这是不可能的。类型mpz_t被定义为数组类型:
typedef __mpz_struct mpz_t[1];

函数不能返回数组。

这意味着你可以定义一个类型为mpz_t的对象,然后将其作为参数传递给函数,允许函数修改其值(因为数组会衰减为指针)。

在评论中,你写道:

我不明白为什么文档中有被称为返回mpz_t的函数声明。

文档显示了一些,而不是实际的函数,例如mpq_numrefmpq_numden,它们被描述为返回mpz_t值。实际上,它们都产生一个结果,其类型是mpz_t数组的元素类型的指针(__mpz_struct*)。该值可以传递给文档中记录为使用mpz_t参数的函数,但实际上所有这样的函数都采用指针参数。

C和C++不允许数组类型的参数或返回数组值的函数,但它们有几个特性,让你编写代码看起来好像这是可能的。在大多数情况下,数组类型的表达式会转换为指针,并且数组类型的函数参数会被“调整”为指针参数。(就我个人而言,我不是特别喜欢GMP/MPIR利用这一点的方式。)


感谢您的澄清。在 http://www.mpir.org/mpir-2.7.2.pdf 的第47页,有两个返回mpz_t的函数,但我猜它与我所问的不相关。 - adn
这些是宏,而不是实际的函数。我找到了一些例子,在这些例子中mpq_numref()的结果被传递给了mpz_add()。显然,它产生的不是一个mpz_t,而是指向元素类型的指针--这就是mpz_add所接受的参数。例如,你不能将mpq_numref的结果赋值给一个mpz_t对象。 - Keith Thompson

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接