0

質問mpz_t to unsigned long long conversion (gmp lib)の投稿を見て、Chris Jester-Young が答えを教えてくれました

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 ですか?

4

1 に答える 1

0

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`
于 2013-09-09T20:01:12.873 に答える