Passer des entiers de taille arbitraire de Prolog à C
En ce moment, j'apprends à interfacer SICStus Prolog avec le code C.
Je voudrais avoir / utiliser / voir une implémentation C de "poids Hamming" d'entiers de taille arbitraire dans SICStus Prolog version 4.
Il me semble que j'ai besoin de fonctions C pour tester les types de termes (SP_is_integer) et de fonctions C pour accéder aux termes Prolog (SP_get_integer, SP_get_integer_bytes).
Cependant, je ne sais pas comment utiliser SP_get_integer_bytes d'une manière portable et robuste. Pourriez vous s'il vous plaît pointez-moi vers un code C solide bien conçu faisant exactement cela?
25
demandé sur
false
2015-03-03 15:39:13
1 réponses
Utilisez-le quelque chose comme ceci:
SP_term_ref tr = ... some term ...
int native = 0; // want portable, little endian
size_t buf_size = 0;
if (!SP_get_integer_bytes(tr, NULL, &buf_size, native)
// if buf_size was updated, then there was not really an error
&& buf_size == 0)
{
// Something wrong (e.g., not an integer)
return ERROR;
}
// here buf_size > 0
void *buffer = SP_malloc(buf_size);
if (buffer == NULL)
{
return ERROR;
}
if (!SP_get_integer_bytes(tr, buffer, &buf_size, native))
{
// Something wrong. This would be surprising here
error();
}
// Here buffer contains buf_size bytes, in
// twos-complement, with the least significant bytes at lowest index.
// ... do something with buffer ...
// finally clean up
SP_free(buffer);
14
répondu
Per Mildner
2016-02-02 11:49:11