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