Преобразование ull в mpz_t

Я видел сообщение в вопросе mpz_t для беззнакового длинного преобразования (gmp lib) и Криса Шут-Юнга дал мне ответ

mpz_t ull2mpz(unsigned long long ull) { char buf[40]; int len; mpz_t result; len = snprintf(buf, sizeof buf, "%llx"); if (len >= sizeof buf) { /* oops */ } mpz_init(result); len = gmp_sscanf(buf, "%Zx", result); if (len != 1) { /* oops */ } return result; } 

Проблема здесь в том, что, как указано в разделе Как преобразовать соглашение параметра GMP C в нечто более естественное? mpz_t – массив. Как я могу обойти это (не делая странных вещей, просто возвращая значение)? Если я напишу вместо этого

 void mpz_set_ull(mpz_t val, unsigned long long ull){ char buf[40]; int len; mpz_t result; len = snprintf(buf, sizeof buf, "%llx"); if (len >= sizeof buf) { /* oops */ } mpz_init(result); len = gmp_sscanf(buf, "%Zx", result); if (len != 1) { /* oops */ } mpz_set(val,result); } 

Я получаю неправильные результаты.

И, является ли его код законным C?

OP не использует snprintf() правильно. Нужно пройти ull .

использование

 char buf[sizeof(ull)*CHAR_BIT/3 + 2]; // let the sizeof `buf` be sized per `ull` needs ... snprintf(buf, sizeof buf, "%llx", ull); // Add missing `ull`