У меня возникла проблема при использовании библиотеки mpir в C ++. Можно ли вернуть значение mpz_t из функции? Когда я пытаюсь это сделать, у меня появляется следующая ошибка:
RSA.cpp:50:36: error: ‘HASHtemp’ declared as function returning an array
mpz_t RSA::HASHtemp( mpz_t message )
Нет, это невозможно. Тип mpz_t
определяется как тип массива:
typedef __mpz_struct mpz_t[1];
и функция не может вернуть массив.
Это означает, что вы можете определить объект типа mpz_t
а затем передать его в качестве аргумента функции, позволяя функции изменять свое значение (поскольку массивы распадаются на указатели).
В комментарии вы написали:
Я не понимаю, почему существуют объявления функций, которые, как говорят, возвращают
mpz_t
в документации.
Документация показывает пару макрос, не фактические функции, mpq_numref
а также mpq_numden
, что это описывает как возвращение mpz_t
ценности. Фактически они оба дают результат, тип которого является указателем на тип элемента mpz_t
массив (__mpz_struct*
). Это значение может быть передано функции, которая задокументирована как mpz_t
аргумент, но на самом деле все такие функции принимают аргументы указателя.
C и C ++ не допускают ни параметров типа массива, ни функций, возвращающих значения массива, но у них есть несколько функций, которые позволяют писать код, который выглядит так, как если бы это было возможно. Выражение типа массива в большинстве случаев преобразуется в указатель, а параметр функции типа массива «настраивается», чтобы стать параметром указателя. (Лично я не большой поклонник того, как GMP / MPIR использует это преимущество.)
Других решений пока нет …