2016-11-13 5 views
-1

Я использую эту функцию из произвольной точности арифметических библиотеки GMP:Как использовать заполнители для ненужных параметров в C++

Function: void mpz_gcdext (mpz_t g, mpz_t s, mpz_t t, const mpz_t a, const mpz_t b) 

Set g to the greatest common divisor of a and b, and in addition set s and t to coefficients satisfying a*s + b*t = g. The value in g is always positive, even if one or both of a and b are negative (or zero if both inputs are zero). The values in s and t are chosen such that normally, abs(s) < abs(b)/(2 g) and abs(t) < abs(a)/(2 g), and these relations define s and t uniquely. There are a few exceptional cases: 

If abs(a) = abs(b), then s = 0, t = sgn(b). 

Otherwise, s = sgn(a) if b = 0 or abs(b) = 2 g, and t = sgn(b) if a = 0 or abs(a) = 2 g. 

In all cases, s = 0 if and only if g = abs(b), i.e., if b divides a or a = b = 0. 

If t is NULL then that value is not computed. 

Мне не нужны значения «г» или «т» и не хотел для создания переменных с единственной целью перехода к этой функции. Что я могу сделать, чтобы передать что-то вроде заполнителя этой специфической функции и как это сделать на C++ вообще?

+0

Это не работает. Если для функции библиотеки требуется параметр, она должна быть указана. Возможно, что данный параметр функции библиотеки является необязательным, поэтому библиотека документации библиотеки объяснит, какое значение будет передаваться для этого параметра, в этом случае. Дополнительную информацию см. В документации к библиотечной функции. –

+0

Конечно, я понял, что это верно для входных параметров, но я думал, что смогу использовать что-то произвольное для параметров вывода, которые мне не нужны. Несчастная. Спасибо! –

+0

«Если t равно NULL, тогда это значение не вычисляется», поэтому, по крайней мере, для этого, ваш ответ тривиален. Если вы хотите пропустить обновление g, вы можете посмотреть код для 'mpz_gcdext' и адаптировать его к своей потребности, вызвав основной' mpn_gcdext' самостоятельно. Хотя это не задокументировано, вы также можете передать s = NULL функции. Вы можете отправить патч в GMP, который также позволяет g = NULL ... –

ответ

-1

Вы можете перегрузить функцию.

void mpz_gcdext (mpz_t s, const mpz_t a, const mpz_t b) 
{ 
    mpz_t g, t; 
    // initialize g and t as needed 
    mpz_gcdext(g, s, t, a, b); 
} 

Помогло ли это?

+0

Суть в том, чтобы избежать объявления и инициализации переменных, которые мне не нужны. Это все равно. –

+0

ОК. Если функция mpz_gcdext ожидает эти аргументы, вы должны объявить и инициализировать их. Перегрузка позволит вам сделать это только в одном месте, вместо того чтобы делать это везде, где вы вызываете mpz_gcdext, но вам все равно нужно это делать где-то. – Waxrat