2015-03-03 21 views
25

Im Moment lerne ich, wie man SICStus Prolog mit C-Code verbindet.Weitergabe von Integern beliebiger Größe von Prolog nach C

würde Ich mag haben/Nutzung/sieht eine C-Implementierung von „Hamming-Gewicht“ von beliebiger Größe ganzen Zahlen in SICStus Prolog Version 4.

Es scheint mir, dass ich C-Funktionen zum Testen Begriff Typen benötigen (SP_is_integer) und C-Funktionen für den Zugriff auf Prolog-Terme (SP_get_integer, SP_get_integer_bytes).

Allerdings bin ich nicht sicher, wie SP_get_integer_bytes in einer tragbaren, robusten Art und Weise zu verwenden. Könntest du mich bitte auf einen gut ausgearbeiteten, soliden C-Code hinweisen, der genau das tut?

+2

SP_get_integer_bytes() ist für beliebig genaue Zahlen. –

Antwort

14

Verwenden Sie es so etwas wie dieses:

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); 
+2

Dies funktioniert mit jeder beliebigen Ganzzahl. Dies funktioniert mit jedem Puffer (z. B. könnten Sie einen statischen Puffer verwenden, der normalerweise groß genug ist, und dann einen dynamischen Puffer zuweisen, wenn die ganze Zahl zu groß ist, um in den statischen Puffer zu passen). –