Подтвердить что ты не робот

Передача целых чисел произвольного размера от Prolog до C

Прямо сейчас, я изучаю интерфейс SICStus Prolog с кодом C.

Я хотел бы иметь/использовать/видеть реализацию C "веса Хэмминга" целых чисел произвольного размера в версии SICStus Prolog версии 4.

Мне кажется, что мне нужны функции C для тестирования типов термов (SP_is_integer) и функций C для доступа к терминам Prolog (SP_get_integer, SP_get_integer_bytes).

Однако я не уверен, как использовать SP_get_integer_bytes в переносном, надежном режиме. Не могли бы вы указать мне на какой-то хорошо продуманный твердый код C, который делает именно это?

4b9b3361

Ответ 1

Используйте его примерно так:

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