Преобразование 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?

1 ответ

ОП не использует 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`
Другие вопросы по тегам