2015-03-03 17 views
25

W tej chwili uczę się, jak łączyć SICStus Prolog z kodem C.Przekazywanie liczb całkowitych o dowolnych rozmiarach od Prolog do C

chciałbym mieć/użytkowania/patrz implementację C o wadze Hamminga „arbitralny” z wielkości liczb całkowitych w wersji SICStus Prolog 4.

Wydaje mi się, że muszę funkcje C przez rodzajów testów terminowych (SP_is_integer) i funkcje C dostępu do terminów Prolog (SP_get_integer, SP_get_integer_bytes).

Jednak nie jestem pewien, jak używać SP_get_integer_bytes w przenośny, solidny sposób. Czy mógłbyś wskazać mi jakiś dobrze napisany solidny kod C, robiący właśnie to?

+2

SP_get_integer_bytes() jest dla dowolnych precyzyjnych liczb całkowitych. –

Odpowiedz

14

Używaj go tak:

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

Działa to z dowolną liczbą całkowitą. Działa to z dowolnym buforem (np. Można użyć statycznego bufora, który jest zwykle wystarczająco duży, a następnie przydzielić bufor dynamiczny, gdy liczba całkowita jest zbyt duża, aby zmieścić się w buforze statycznym). –

Powiązane problemy